使User.Identity包括来自访问令牌负载的电子邮件地址。

3
我们正在使用introspection的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";
});

这基本上是有效的。
连接/内省处的授权服务器响应良好。
{
  "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属性?
这里是我们在GitHub上的代码
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接