asp.net-web-api2 - Auth0 - 在 Owin 上使用带有承载访问令牌的 JWT 使用 RS256 进行身份验证
问题描述
在使用普通嵌入式登录实现 Auth0 身份验证/授权时,我能够对用户进行身份验证并取回有效的accessToken/idToken。
初始化
webAuth = new auth0.WebAuth({ domain: 'xxx.auth0.com', clientID: 'myclientid', responseType: 'token id_token' });
成功获取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/"
ie 设置为 Auth0 API Identifier,则 API 方法成功授权(状态 200)用户。
但是这次它不会给ClaimsIdentity.Claims和ClaimTypes.Email
我在这里想念什么?
解决方案
我的错:
- 我应该将ApiIdentifier传递给ValidAudience值。
- 当我在授权用户时传递accessToken时,当 accessToken 声明不包含 ClaimTypes.Email 时,我需要将 Auth0 中的规则设置为:如何在 Auth0 中设置规则。稍后我可以将我的服务器 api 逻辑检查为(下面的代码)以验证用户。
(User.Identity as ClaimsIdentity)?.Claims.FirstOrDefault(c => c.Type == "you-have-set-this-rule-in-auth0")?.Value;
只是附加组件,在实现 Auth0 时值得一读的链接。Auth0 提供了一个不错的 nuget 包Auth0.OpenIdConnectSigningKeyResolver,它在上面提供的链接中有很好的用途。
推荐阅读
- docker - 无法从外部应用程序连接到 Kafka
- python - Python将变量的内容复制到剪贴板
- paypal - 从 Magento 结帐中删除 Paypal Credit
- flutter - 如何将数据从方法 _callLogs 传递到正文并打印?
- java - 我的 .jar 可执行文件仅在命令行中正常工作,但在通过资源管理器单击它时不能正常工作(相同位置)
- r - 如何在函数中将“一切可能”传递给 by?
- c++ - 在 VS Code 中使用离线 cppreference 获取上下文帮助
- java - 如何生成 @CreatedDate LocalDateTime 作为时间戳?
- flask - 将当前使用 uWSGI Web 服务器的烧瓶 Web 应用程序迁移到 ASGI Web 服务器(uvicorn)
- reactjs - Gatsby 和 netlify .env var