【问题标题】:Azure AD B2C with Angular4 and WebAPI Core2 token validation issue [duplicate]带有 Angular4 和 WebAPI Core2 令牌验证问题的 Azure AD B2C [重复]
【发布时间】:2017-11-09 03:46:01
【问题描述】:

似乎 Azure 文档不能给出一个明确的例子来正确地做到这一点。

有 Angular4 (WebApp) 和 WebAPI Core 2.0 后端。Azure B2C 中配置了两个应用程序。 WebApp 在其 API 访问中具有 WebAPI 应用程序。

Web 应用程序被重定向到 https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize。在那里,提供凭据,然后 AAD B2C 使用 access_token、token_type、expires_in、id_token url 参数回调 WebApp 页面。

然后,WebApp 使用 Authorization 标头中的 access_token 向后端的受保护端点发出请求。 MessageReceivedAsync 在请求到达后端并一直通过验证令牌时被调用。

但是,当进程退出方法时,下一步将进入 AuthenticationFailed 并出现错误。

"IDX10501: Signature validation failed. Unable to match 'kid': 'Base64_kid', 
token: '{"alg":"RS256","typ":"JWT","kid":"Base64_kid"}.{"iss":"number of claims"}'." 

我的理解是 Audience 是 WebAPI 应用程序 ID。我只有一个 SingIn/Up 政策。

我在这里缺少什么来完成没有错误的 jwt 手动验证?另一个问题,当在令牌验证时创建 claimPrincipal 时,它如何进入请求上下文以能够访问受保护的端点?

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddCors();

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.SaveToken = true;
            options.RequireHttpsMetadata = false;
            options.Authority = string.Format("https://login.microsoftonline.com/{0}/v2.0/",
                Configuration["Authentication:AzureAd:ida:Tenant"], Configuration["Authentication:AzureAd:ida:Policy"]);
            options.Audience = Configuration["Authentication:AzureAd:ida:ClientId"];
            options.Events = new JwtBearerEvents
            {
                OnAuthenticationFailed = AuthenticationFailed,
                OnMessageReceived = MessageReceivedAsync,
                OnChallenge = Challenge,
                OnTokenValidated = TokenValidated
            };
        });

    ...
}
private Task MessageReceivedAsync(MessageReceivedContext arg)
{
    string jwtToken = null;

    var aadInstance = Configuration["Authentication:AzureAd:ida:AADInstance"];
    var tenant = Configuration["Authentication:AzureAd:ida:Tenant"];
    var audience = Configuration["Authentication:AzureAd:ida:Audience"];
    var policy = Configuration["Authentication:AzureAd:ida:Policy"];
    var authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

    string _issuer = string.Empty;
    List<SecurityKey> _signingTokens = null;
    var authHeader = arg.HttpContext.Request.Headers["Authorization"];

    // 7 = (Bearer + " ").Length
    var token = authHeader.ToString().Substring(7);
    try
    {
        string stsDiscoveryEndpoint = string.Format("{0}/v2.0/.well-known/openid-configuration?p={1}", authority, policy);
        var configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, 
            new OpenIdConnectConfigurationRetriever());

        OpenIdConnectConfiguration config = null;
        var openIdConfigTask = Task.Run(async () => {
            config = await configManager.GetConfigurationAsync();
        });
        openIdConfigTask.Wait();

        _issuer = config.Issuer;
        _signingTokens = config.SigningKeys.ToList();
    }
    catch(Exception ex)
    {
        ...
    }

    var tokenHandler = new JwtSecurityTokenHandler();
    var validationParameters = new TokenValidationParameters
    {
        ValidAudience = audience,
        ValidIssuer = _issuer,
        IssuerSigningKeys = _signingTokens
    };
    var claimsPrincipal = tokenHandler.ValidateToken(token, validationParameters, out var validatedToken);
    //Thread.CurrentPrincipal = claimsPrincipal; ?
    //var ticket = new AuthenticationTicket(claimsPrincipal, arg.Scheme.Name); ?
    //arg.HttpContext.User = claimsPrincipal; ?

    return Task.FromResult(0);
}

【问题讨论】:

  • 我遇到了同样的问题。必须手动设置 MetadataAddress 属性。请参阅重复的 SO 发布原因和this code sample
  • 两个选项都有效。

标签: asp.net-web-api2 jwt identity azure-ad-b2c .net-core-2.0


【解决方案1】:

options.Audience 属性是正确的(即 Web API 应用程序的应用程序标识符),但 JWT 不记名身份验证中间件正在下载错误的签名密钥,因为您似乎没有将 options.Authority 属性设置到右侧价值。

它必须包含 Azure AD B2C 策略。

您应该将其设置为:

https://login.microsoftonline.com/tfp/{tenant}/{policy}/v2.0/'

如:

https://login.microsoftonline.com/tfp/{Configuration["Authentication:AzureAd:ida:Tenant"]}/{Configuration["Authentication:AzureAd:ida:Policy"]}/v2.0/.

作为令牌验证的结果,HttpContext.User 对象包含来自令牌的声明,因此您可以控制访问,例如通过范围。

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多