2

我正在将 Web Api 与 azure China 活动目录集成并部署到 azure china 环境。azure China 的端点与常规的 azure 环境完全不同。我想知道如何为 Web API指定 AADInstance https://login.chinacloudapi.cn/ ?

Web API 启动.Auth.cs

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    {
        Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
        },
    });

Web API Web.Config

<add key="ida:Tenant" value="directoryname.partner.onmschina.cn" />
<add key="ida:Audience" value="https://directoryname.partner.onmschina.cn/AppName" />
<add key="ida:ClientID" value="…" />
<add key="ida:Password" value="…" />

这可以为 MVC 应用程序完成

MVC 启动.Auth.cs

ApplicationDbContext db = new ApplicationDbContext();

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseCookieAuthentication(new CookieAuthenticationOptions());

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        ClientId = clientId,
        Authority = Authority,
        PostLogoutRedirectUri = postLogoutRedirectUri,

        Notifications = new OpenIdConnectAuthenticationNotifications()
        {
            // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
            AuthorizationCodeReceived = (context) => 
            {
                var code = context.Code;
                ClientCredential credential = new ClientCredential(clientId, appKey);
                string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
                AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID));
                AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
                code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);

                return Task.FromResult(0);
            }
        }
    });

MVC Web.Config

<add key="ida:ClientId" value="…" />
<add key="ida:AADInstance" value="https://login.chinacloudapi.cn/" />
<add key="ida:ClientSecret" value="…" />
<add key="ida:Domain" value="directoryname.partner.onmschina.cn" />
<add key="ida:TenantId" value="…" />
<add key="ida:PostLogoutRedirectUri" value="https://localhost:44300/" />
4

2 回答 2

3

是的,我们必须设置元数据端点。如WindowsAzureActiveDirectoryBearerAuthenticationExtensions.cs中所述

我在 web.config 中添加了一个条目

<add key="ida:AADInstance" value="login.microsoftonline.com" />

然后在 Startup.Auth.cs 中设置 MetadataAddress

MetadataAddress = $"https://{ConfigurationManager.AppSettings["ida:AADInstance"]}/{ConfigurationManager.AppSettings["ida:Tenant"]}/federationmetadata/2007-06/federationmetadata.xml".

现在它起作用了。

于 2017-01-12T18:36:31.127 回答
2

关于使用不同主权云的应用程序,这里有几点需要注意:

  1. 每个 Sovereign Cloud(中国、美国政府、德国、全球)都是其自己的 AAD 实例。为了让您通过应用程序对其令牌端点进行身份验证,您必须为该环境单独注册一个应用程序。在全球范围内注册的应用程序,可以调用“ https://login.microsoftonline.com ”,通常无法向其他端点进行身份验证,如“ https://login.chinacloudapi.cn ”。
  2. 作为客户端应用程序,您必须确保使用您要进行身份验证的环境的所有正确参数来请求令牌。如果您想在中国获得 AAD Graph API 的令牌,以便您可以访问基于中国云 AAD 环境的租户的目录信息,您必须确保:
  3. 作为 Web api,您必须验证您收到的访问令牌是否由与该 AAD 环境对应的签名密钥签名。每个 AAD 环境都有自己的签名密钥,如果您使用 OWIN 等库来帮助您验证令牌的内容,您还必须更新 OWIN 设置以指向正确的元数据端点。

我希望这有助于解决你的问题,这个问题一开始有点宽泛。如果您有更具体的后续问题,请在下面发表评论。

于 2017-01-11T22:28:38.473 回答