使User.Identity包含访问令牌有效负载中的电子邮件地址

时间:2016-08-24 00:37:24

标签: oauth-2.0 asp.net-core openid-connect openiddict

我们通过内省使用OAuth来验证访问令牌。

app.UseOAuthIntrospection(options =>
{
    options.AutomaticAuthenticate = true;
    options.AutomaticChallenge = true;
    options.Authority = "http://localhost:12345/";
    options.Audiences.Add("ResourceServer01");
    options.ClientId = "ResourceServer01";
    options.ClientSecret = "secret_secret_secret";
});

这主要是有效的。

connect/introspect处的授权服务器响应很好。

{
  "active": true,
  "iss": "http://localhost:12345/",
  "sub": "797264b3-194c-483f-08fb-08d3cbab9158",
  "scope": "openid email roles",
  "iat": 1471998289,
  "nbf": 1471998289,
  "exp": 1472000089,
  "jti": "274cbb7f-9412-4d69-8c02-ca6a500b4a36",
  "token_type": "Bearer",
  "aud": [
    "ResourceServer01",
    "ResourceServer02"
  ],
  "email": "shaun@bigfont.ca",
  "AspNet.Identity.SecurityStamp": "4956a5c3-9efd-4f51-9746-43a187698e1e"
}

对资源服务器的请求超过Authorize属性。这也很好。

[Authorize(ActiveAuthenticationSchemes = OAuthValidationDefaults.AuthenticationScheme)]
[HttpGet("message")]
public IActionResult GetMessage() {
    var identity = User.Identity as ClaimsIdentity;
    if (identity == null) {
        return BadRequest();
    }
    return Json(User);
}

User不包含subemail属性。它看起来像这样:

{
    "claims": [
        {
            "issuer": "LOCAL AUTHORITY",
            "originalIssuer": "LOCAL AUTHORITY",
            "properties": {},
            "subject": {
                "authenticationType": "Bearer",
                "isAuthenticated": true,
                "actor": null,
                "bootstrapContext": null,
                "claims": []
            }
        }
    ]
}

我们如何配置资源服务器以在声明中包含subemail属性?

这是our code on GitHub

1 个答案:

答案 0 :(得分:3)

可能存在声明(如果它们不是,它是内省中间件中的一个错误),但JSON.NET不是很擅长序列化Claim / ClaimsIdentity / ClaimsPrincipal,可能是因为这些类型具有循环引用(例如Claim.Subject / ClaimsIdentity.Claims)。

尝试使用User.FindFirst(ClaimTypes.NameIdentifier)?.ValueUser.FindFirst(ClaimTypes.Email)?.Value /确认主题标识符和电子邮件地址。

如果有效,请考虑返回您的声明的投影,而不是ClaimsPrincipal实例:

return Json(
    from claim in User.Claims 
    select new { claim.Type, claim.Value }
);

以下是调试窗口中User的屏幕截图。

Visual Studio Code Debug Window showing the User