Auth0 - 使用带有承载访问权限的Owin上的JWT使用RS256进行身份验证

时间:2018-06-15 13:20:05

标签: asp.net-web-api2 owin auth0

在使用普通嵌入式登录实现Auth0身份验证/授权时,我可以对用户进行身份验证并获取有效的 accessToken / idToken

  • 初始化

    webAuth = new auth0.WebAuth({
        domain: 'xxx.auth0.com',
        clientID: 'myclientid',
        responseType: 'token id_token'
    });
    
  • 成功获取令牌。

    webAuth.client.login({
        realm: _Connection,
        username: 'aaa@b.com',
        password: 'password',
        audience: 'https://xxx.auth0.com/api/v2/',
        scope: 'openid profile email'
    }, function (err, args) {
        if (!err) 
          {
           webAuth.client.userInfo(token, function (args, authUserData) {
            var ajaxAdapter = breeze.config.getAdapterInstance("ajax");
            ***Setting bearer token to Global level.**
            ajaxAdapter.defaultSettings = {
             headers: ({ "Authorization": "Bearer " + token })
            };
            myAPICall(args.email).then({}).fail({});
           });
        }
    });
    
  • 使用OWIN验证RS256签名JWT的服务器代码。

    private void ConfigureAuthZero(IAppBuilder app)
    {
        var issuer = $"https://{ConfigurationManager.AppSettings["Auth0:Domain"]}/";
        var audience = ConfigurationManager.AppSettings["Auth0:ClientID"];
        var apiIdentifier = ConfigurationManager.AppSettings["Auth0:ApiIdentifier"];
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        string certificatePath = HostingEnvironment.MapPath("~/mycertificate.cer");
        var certificate = new X509Certificate2(certificatePath);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidAudience = audience,
                    ValidIssuer = issuer,
                    IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) => new X509SecurityKey(certificate)
                }
            });
    }
    

我的问题

上述服务器代码不会授权用户。 但是,如果我将ValidAudience = "https://xxx.auth0.com/api/v2/"设置为Auth0 API标识符,则API方法会成功授权(状态200)用户。

但这次它不会使用 ClaimTypes.Email

给予 ClaimsIdentity.Claims

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我的错误:

  1. 我应该将 ApiIdentifier 传递给 ValidAudience 值。
  2. 当我在授权用户时传递 accessToken ,由 accessToken声明的时间不包含ClaimTypes.Email,所以 我需要将Auth0中的规则设置为:How to set the rules in Auth0。 之后我可以将我的服务器api逻辑检查为(代码下方) 验证用户。
    (User.Identity as ClaimsIdentity)?.Claims.FirstOrDefault(c => c.Type == "you-have-set-this-rule-in-auth0")?.Value;
  3. 只是加载项,Link在实现Auth0时值得一读。 Auth0提供了一个很好的nuget包 Auth0.OpenIdConnectSigningKeyResolver ,它在上面提供的链接中有很好的用途。