OAuth 2.0 和 Open Id Connect 声明问题

OAuth 2.0 and Open Id Connect claims issue

我正在学习 OAuth 2.0Open Id Connect,现在我遇到了一个问题:id_token:

中没有提出声明

我已经创建了 InMemoryUser 并为他声明:

return new List<InMemoryUser>()
{
    new InMemoryUser()
    {
        Username = "SomeName",
        Password = "SomePassword",
        Subject = "b05d3546-6ca8-4d32-b95c-77e94d705ddf",
        Claims = new Claim[]
        {
            new Claim(IdentityServer3.Core.Constants.ClaimTypes.GivenName, "MyGivenName"),
            new Claim(IdentityServer3.Core.Constants.ClaimTypes.FamilyName, "MyFamilyName"),

         }
     }
}

我的范围:

return new List<Scope>()
{
    StandardScopes.OpenId,
    StandardScopes.Profile,

    new Scope()
    {
        Name = "somename",
        DisplayName = "some display name",
        Description = "some description",
        Type = ScopeType.Resource
    }
};

此外,我已经创建了 MVC 客户端和 Startup class 并包含了配置文件 scope:

public void Configuration(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions()
    {
        AuthenticationType = "Cookies"
    });

    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
    {
        ClientId = "TripsHybrid",
        Authority = Constants.Constants.TripsSts,
        RedirectUri = Constants.Constants.TripsMvc,
        SignInAsAuthenticationType = "Cookies",
        ResponseType = "code id_token token",
        Scope = "openid profile", // "profile" scope inсluded
    }
}

但是当我获得 id_token 并对其进行解码时,没有我在创建 InMemoryUser 时设置的声明。此外,在将它们打印到 Debug:

之后,User.Identity.Claims 中没有声明
if (this.User.Identity.IsAuthenticated)
{
    Debug.WriteLine("Claims:");
    var identity = this.User.Identity as ClaimsIdentity;
    foreach (var claim in identity.Claims)
    {
        Debug.WriteLine(claim.Type + " - " + claim.Value);
    }
}

请帮我找出原因并在id_token中添加声明。谢谢

对我来说一切都很好,但有时由于 identityserver 和 aspNetIdentity 中的声明之间的差异,声明没有正确映射

尝试清除 MVC 应用中的默认声明映射 Startup.cs:

 // Clear The InboundClaimTypeMap
        JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();

终于找到问题的解决方法了。

问题出在 IdentityServer3 NuGet 包版本中。在教程中使用了包 IdentityServer3 2.0.1,但我已经安装了包 IdentityServer3 2.5.0.

我在获取范围时更改了我的代码:

public static IEnumerable<Scope> Get()
{
    Scope profileScope = StandardScopes.Profile;
    profileScope.IncludeAllClaimsForUser = true; // set this property to true

    return new List<Scope>()
    {
        StandardScopes.OpenId,
        profileScope,

        new Scope()
        {
            Name = "somename",
            DisplayName = "some display name",
            Description = "some description",
            Type = ScopeType.Resource
        }
    };
} 

我已经设置了 IncludeAllClaimsForUser = true,现在所有声明都出现在身份令牌 (id_token) 中,我可以使用此代码(与之前相同)在我的 MVC 客户端中获取所有声明:

if (this.User.Identity.IsAuthenticated)
{
    Debug.WriteLine("Claims:");
    var identity = this.User.Identity as ClaimsIdentity;
    foreach (var claim in identity.Claims)
    {
        Debug.WriteLine(claim.Type + " - " + claim.Value);
    }
}

当我尝试使用旧包时,问题中的代码按预期工作(没有任何更改)。

似乎这个 属性 的默认值在 IdentityServer3 的某些较新版本中更改为 false

谢谢大家。