【问题标题】:How to get User information from auth_token supplied by Auth0 tenant in PKCE flow如何从 PKCE 流程中的 Auth0 租户提供的 auth_token 获取用户信息
【发布时间】:2020-09-05 22:06:32
【问题描述】:

我刚刚从我的 Cordova Ionic5 移动应用程序中成功实现了 PKCE Flow,然后使用 auth_token 对我的 .NET Core 3.1 Web Api 进行授权。

问题是我无法从我的 .NET Core Web Api 访问用户信息: 姓名、电子邮件等

我真的需要知道刚刚通过身份验证的用户是谁。你能帮忙吗?

PKCE 流程 代码在我的Startup.cs

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.Authority = _configuration["Auth0:Domain"];
                options.Audience = _configuration["Auth0:Audience"];
            });

...

app.UseAuthentication();
app.UseAuthorization();

【问题讨论】:

  • 不,我已经尝试了所有方法,但我的用户始终为 NULL!\
  • 你调用 app.UseAuthentication() 和 app.UseAuthorization() 了吗?如果你忘记使用这些中间件,token 将不会被解析并且 User 将为 null
  • 是的,我还更新了我的问题 Startup.cs 以反映这一点
  • 您是否通过 API 请求发送令牌?他们必须有Authorization: Bearer $token 标头。查看来自浏览器开发者控制台的请求,并确保请求包含标头

标签: asp.net-core-webapi auth0 pkce


【解决方案1】:

默认情况下,访问令牌不会包含 nameemail 等用户信息。

这是一个示例访问令牌,用于对 Auth0 租户进行默认身份验证(使用带有 SPA 的 PKCE 流)。

{
  "iss": "https://example.auth0.com/",
  "sub": "auth0|REDACTED",
  "aud": [
    "REDACTED",
    "https://example.auth0.com/userinfo"
  ],
  "iat": 1599312415,
  "exp": 1599398815,
  "azp": "REDACTED",
  "scope": "openid profile email"
}

您的应用还应该收到一个 id_token,它可能如下所示(假设对 /authorize 的请求包括 openid、配置文件和电子邮件范围)。

{
  "nickname": "joe.blogs",
  "name": "joe.blogs@example.com",
  "picture": "REDACTED",
  "updated_at": "2020-09-04T10:21:07.315Z",
  "email": "joe.blogs@example.com",
  "email_verified": false,
  "iss": "https://example.auth0.com/",
  "sub": "auth0|REDACTED",
  "aud": "REDACTED",
  "iat": 1599312415,
  "exp": 1599348415,
  "nonce": "REDACTED"
}

因此,您有几个选项可以将名称和电子邮件发送到后端 API。

  1. 在您的应用中,解析 id_token JWT 以获取姓名和电子邮件,然后将这些字段显式传递给您的后端 API。
  2. 可以通过Auth0 rules 使用姓名和电子邮件来丰富访问令牌。这是将email 添加到访问令牌的示例规则(注意:未经测试):
function addAttributes(user, context, callback) {
  context.accessToken.email = user.email;
  callback(null, user, context);
}

请参阅 Auth0 context objectuser object 的文档,了解您可以访问的内容...

我的想法是选项 #1 是更好的方法,因为; a) 我不喜欢在访问令牌中包含 PII,并且 b) 依赖访问令牌来获取姓名和电子邮件等信息可能会导致后续问题(例如,如果您的后端 API 也需要被调用,会发生什么情况使用没有此信息的 Auth0 M2M 令牌)。

最后,在您的 .NET 应用程序中,您可以通过解析 Authorization HTTP 标头中的 JWT 来获取所需的信息。如果您需要有关这部分的更多信息,请告诉我(如果需要,我也可以提供帮助)......假设主要问题是您在 JWT 访问令牌中没有所需的用户信息(您如果你按照我的指示,现在应该)...

【讨论】:

  • 实际上解决方案是将声明添加到 auth_token。这是通过在 Auth0 中设置规则来完成的。一旦我设置了规则,我就可以在 auth_token 中看到我的声明。
  • 很高兴听到您解决了这个问题。鉴于这是我建议的选项之一(请参阅答案中的选项 #2),您会考虑释放最初问题的赏金吗?
  • 嘿伙计,对不起,赏金已过期...我真诚地道歉...
猜你喜欢
  • 2016-09-27
  • 2019-05-08
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2016-10-08
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多