1

我们通过“新”和“旧”门户在同一个 AAD B2C租户中注册了两个应用程序。

使用“旧”应用程序凭据进行的身份验证工作正常。使用“新”应用程序凭据 - 出现错误:

IDX10500:签名验证失败。无法解析 SecurityKeyIdentifier:'SecurityKeyIdentifier(IsReadOnly = False,Count = 1,Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause)'

将 Microsoft.Owin.Security.ActiveDirector 库(保护 ASP.Net Web API)与在 AAD B2C租户中注册的应用程序一起使用是否正确。

PS我的问题是基于这篇文章

4

1 回答 1

0

只能通过新 Azure 门户 (portal.azure.com)中的 Azure AD B2C 刀片创建应用程序。

不要使用经典的 Azure 门户 (manage.windowsazure.com) 为 Azure AD B2C 创建应用程序。

如果你想保护一个 WebApp,你应该使用 Owin 的 OpenIdConnectAuthentication。本文档包含有关如何执行此操作的更多详细信息:Sign-Up & Sign-In in a ASP.NET Web App

如果你想保护 WebAPI,你应该使用 Owin 的 OAuthBearerAuthentication。本文档包含有关如何执行此操作的更多详细信息:构建 .NET Web API


WebApp 的示例配置:

public void ConfigureAuth(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

    app.UseOpenIdConnectAuthentication(
        new OpenIdConnectAuthenticationOptions
        {
            // Generate the metadata address using the tenant and policy information
            MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),

            // These are standard OpenID Connect parameters, with values pulled from web.config
            ClientId = ClientId,
            RedirectUri = RedirectUri,
            PostLogoutRedirectUri = RedirectUri,

            // Specify the callbacks for each type of notifications
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = OnRedirectToIdentityProvider,
                AuthorizationCodeReceived = OnAuthorizationCodeReceived,
                AuthenticationFailed = OnAuthenticationFailed,
            },

            // Specify the claims to validate
            TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = "name"
            },

            // Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
            Scope = $"{OpenIdConnectScopes.OpenId} {YourScope1} {YourScope2}"
        }
    );
}

Web API 的示例配置:

    public void ConfigureAuth(IAppBuilder app)
    {
        TokenValidationParameters tvps = new TokenValidationParameters
        {
            // Accept only those tokens where the audience of the token is equal to the client ID of this app
            ValidAudience = ClientId,
            AuthenticationType = Startup.DefaultPolicy
        };

        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
        {
            // This SecurityTokenProvider fetches the Azure AD B2C metadata & signing keys from the OpenIDConnect metadata endpoint
            AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider(String.Format(AadInstance, Tenant, DefaultPolicy)))
        });
    }
于 2017-05-10T13:59:52.023 回答