我正在尝试使用 azure 活动目录验证多个客户端(从 Windows 服务器应用程序连接 - 无浏览器)访问我的 .Net4.51 webAPI。
我为我的 webapi 创建了一个名为“ServerWebApi”的 Azure AD 应用程序,并使用以下应用程序设置将我的 webapi 应用程序代码配置为在 webConfig 中指向它。
<add key="ida:Tenant" value="myDomainName.onmicrosoft.com" />
<add key="ida:Audience" value="https://myDomainName.onmicrosoft.com/ServerWebApi" />
<add key="ida:ClientID" value="<client id>" />
因此,当请求带有令牌时,它应该使用这些设置来针对我的名为 ServerWebApi 的 AD WebApi 应用程序验证令牌。
现在,为了让每个客户端都能获得令牌,我为每个客户端创建了一个 Azure 应用程序。(我没有将它创建为本机应用程序,而是作为 webapi 应用程序创建,以便我可以为每个客户端创建一个单独的密钥)。我还将 Azure 中的实际 webAPI 应用程序 (ServerWebApi) 添加到“此应用程序访问的 Web API”列表中。(对于这个例子,我的第一个客户端称为 myClientWebApiApp)
所以现在我的客户端可以成功地从其客户端应用程序在 AD 中请求一个令牌,但是当它发布到服务器(webapi)时,我得到一个 401 - 未经授权。因此,我认为我未能针对我的 Azure AD ServerWebApi webApi 验证令牌。
我用来获取令牌并调用我的 webApi 的客户端应用程序代码如下
// Create an ADAL AuthenticationContext object and link it to my tennant domain myDomainName.onmicrosoft.com
var authority = ConfigurationManager.AppSettings["Tenant"];
authenticationContext = new AuthenticationContext(authority);
//Client Cerdential Object used while Acquiring a token from Windows Azure AD
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);
// Invoke AuthenticationContext.AcquireToken to obtain an AccessToken.
// Uses previously-created ClientCredential to authenticate
authenticationResult = authenticationContext.AcquireToken(resource, clientCred);
httpClient.DefaultRequestHeaders.Clear();
//Add authorization header to HttpClient
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",authenticationResult.AccessToken);
var data = "new Value";
// Call the Service web api to update
HttpResponseMessage response = httpClient.PostAsJsonAsync(resourceurl + "api/Values", data).Result;
它使用以下配置设置
<add key="Tenant" value="https://login.windows.net/myDomainName.onmicrosoft.com"/>
<add key="ClientId" value= "<client id>"/>
<add key="ClientSecret" value= "<client secret>"/>
<add key="ResourceUrl" value="https://localhost:44300/"/>
<add key="AppIdUri" value="https://myDomainName.onmicrosoft.com/myClientWebApiApp"/>
Client Id 是我创建的 Client webapi 应用程序的 ID,ClientSecret 是我在 Azure AD 中针对该应用程序创建的密钥。
有谁知道我正在做的事情是否可行,如果可以,我做错了什么?