Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为Web API指定不同的AADInstance?_C#_Azure_Asp.net Web Api_Azure Active Directory_Azure China - Fatal编程技术网

C# 如何为Web API指定不同的AADInstance?

C# 如何为Web API指定不同的AADInstance?,c#,azure,asp.net-web-api,azure-active-directory,azure-china,C#,Azure,Asp.net Web Api,Azure Active Directory,Azure China,我正在将Web Api与azure中国active directory集成,并部署到azure中国环境。azure中国的端点与常规azure环境完全不同。我想知道如何为Web API指定AADInstance webapi启动.Auth.cs app.UseWindowsAzureActiveDirectoryBearerAuthentication( new WindowsAzureActiveDirectoryBearerAuthenticationOptions {

我正在将Web Api与azure中国active directory集成,并部署到azure中国环境。azure中国的端点与常规azure环境完全不同。我想知道如何为Web API指定AADInstance

webapi启动.Auth.cs

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    {
        Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
        },
    });
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);
            }
        }
    });
webapi 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="…" />
<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/" />
MVC 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="…" />
<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/" />

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

  • 每个主权云(中国、美国政府、德国、全球)都是其自身的AAD实例。为了使用应用程序对其令牌端点进行身份验证,必须为该环境单独注册一个应用程序。在worldwide中注册的、可以调用“”的应用程序通常无法向其他终结点(如“”)进行身份验证
  • 作为一个客户端应用程序,您必须确保使用所有正确的参数请求令牌,这些参数适用于您希望进行身份验证的环境。如果您想在中国获得AAD Graph API的令牌,以便访问基于中国云AAD环境的租户的目录信息,您必须确保:
    • 您使用了正确的登录端点()
    • 您为该环境()使用了正确的资源标识符
    • 您使用了正确的客户端id,该id是为该环境注册的
    • 您可以使用正确的回复url以及为该环境注册的其他配置
  • 作为web api,您必须验证您接收的访问令牌是否由对应于该AAD环境的签名密钥签名。每个AAD环境都有自己的签名密钥,如果您使用OWIN之类的库来帮助您验证令牌的内容,则还必须更新OWIN设置以指向正确的元数据端点

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

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

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

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

    现在它工作了。

    Ahhh,我明白你现在在问什么了。在您展示的示例中,您使用了两个非常不同的包;一个用于创建令牌(在Web Api中),另一个用于验证令牌(MVC),非常感谢。非常感谢您的帮助。要在中国访问Azure广告,我们必须使用“/>