【问题标题】:IdentityServer4 How to access user emailIdentityServer4 如何访问用户电子邮件
【发布时间】:2018-03-16 16:53:45
【问题描述】:

我继承了一个现有的项目,而且我是使用 IdentityServer4 的新手,所以请耐心等待。

我收到一个带有 GET 请求的令牌,如下所示:

http://my-identity-server/account/login?returnUrl=%2Fconnect%2Fauthorize%2Flogin%3Fclient_id%3Dmy.client%26redirect_uri%3Dhttp%253A%252F%252Flocalhost:8100/index.html%26response_type%3Dcode%2520id_token%2520token%26scope%3Dopenid%2520profile%2520MyAPI%26state%3D4bc18eac6a354ab3a6997e1b414e7f80%26nonce%3Dbc377c5bfd784f2f87b2621bd9cfeae2

然后我们尝试使用响应提供的 access_token 检索成员信息,并将其用作不记名令牌。这似乎可行,但这是我坚持的部分:

在 API 内部,以下代码返回代表登录用户的 GUID,而不是电子邮件。

Claim cl = this.User.Claims.FirstOrDefault(x => x.Type == "sub");

我需要更改什么以允许 sub 提供登录用户的电子邮件?

我已尝试将电子邮件或配置文件(如您在上面看到的)添加到仅在我的声明列表中生成名称为“范围”和值为“电子邮件”的条目的范围。

编辑

似乎我需要在以某种方式生成令牌时更新范围。当我从数据库中获取设置时,我看到的所有示例都在内存设置中在线使用。当我在 te API 上调用 userinfo 端点时,我也只能访问“子”,例如

{
    "sub": "xx"
}

【问题讨论】:

    标签: asp.net-core identityserver4


    【解决方案1】:

    在 IdentityServer 方面,在您的 Config 类中,当您定义允许的范围时,请确保它包含如下电子邮件:

     ...
     AllowedScopes = new List<string>
     {
          IdentityServerConstants.StandardScopes.OpenId,
          IdentityServerConstants.StandardScopes.Profile,
          IdentityServerConstants.StandardScopes.Email
     }
     ...
    

    然后在您的客户端,在启动类中,您也希望将电子邮件包含在范围内(在您的 app.UseOpenIdConnectAuthentication 方法中)。

     ...
     Scope = "openid profile email",
     ...
    

    此时,当您在 User.Identity.Claims 中单步执行客户端代码时,应该可以访问该电子邮件。

    现在,如果您想更进一步,并在您的客户端应用程序中使用电子邮件作为“用户 ID”(而不是 Guid 子),那么您可以将以下内容添加到 app.UseOpenIdConnectAuthentication 方法客户:

     TokenValidationParameters = {
          NameClaimType = "email"
     }
    

    【讨论】:

    • 谢谢,我相信这是我对现有解决方案没有配置类感到困惑的部分原因。我认为它从数据库中获取所有设置。
    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 2020-02-26
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多