如何设置oidc ResponseType以获取声明和access_token?

问题描述 投票:1回答:2

最近我正在使用IdentityServer4进行SSO,当我调试代码时,我发现ResponseType设置导致了一个棘手的问题。当我像这样设置我的客户端时:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
        services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";
                options.Authority = Configuration["Auth:IdentityServer"];
                options.RequireHttpsMetadata = false;

                options.ClientId = Configuration["Auth:ClientId"];
                options.ClientSecret = Configuration["Auth:ClientSecret"];
                options.ResponseType = "id_token";
                options.SaveTokens = true;
                //options.Scope.Add("8e6144b5-87f6-4638-bf08-1a64599a8b39");
                options.Scope.Add("offline_access");
                options.GetClaimsFromUserInfoEndpoint = true;
            });

我可以得到这样的声明(有完整的声明列表):enter image description here但是,当我更改像这样的options.ResponseType = "id_token token";响应类型声明是这样的(只发出一点声明):

enter image description here

如果我想在用户登录时同时拥有完整的声明列表和访问令牌,我该怎么做才能获得这两者?

oauth openid identityserver4 openid-connect oidc
2个回答
1
投票

默认情况下,如果同时请求访问令牌,IdentityServer将不会在身份令牌中提供用户声明。您可以在源代码here中看到这种情况。要确保身份令牌始终包含用户声明(无论是否请求访问令牌),请在客户端上将AlwaysIncludeUserClaimsInIdToken设置为true


0
投票

我看到您正在尝试使用文档中的一个示例。如我错了请纠正我。

如果没有那么 - 将你的流量改为Hybrid(这意味着ResponseType = "code id_token token")。在身份服务器端也这样做。对范围添加openidprofile。然后,在列出您的声明的地方,您可以使用(假设您使用剃刀页面列出它们):

@foreach (var claim in ((System.Security.Claims.ClaimsPrincipal)User).Claims)
{
    <li>@claim.Type : @claim.Value</li>
}

这应列出您拥有的所有声明(包括access_token本身)。

© www.soinside.com 2019 - 2024. All rights reserved.