3

我们通过自省使用 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,不包含sub也不包含email属性。它看起来像这样:

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

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

这是我们在 GitHub 上的代码

4

1 回答 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 代码调试窗口

于 2016-08-24T01:57:42.023 回答