如何获取访问令牌和用户信息:使用 AspNet Identity 的 IdentityServer4

How to Get Access Token and User Info: IdentityServer4 With AspNet Identity

大家好,

所以我成功地将使用 AspNet 身份验证的 IdentityServer 4 集成到我的项目中。它在身份验证后重定向到客户端,这样就可以了。现在的问题是我想在客户端获取用户详细信息,比如他们的用户名、电子邮件、名字和姓氏。我想用令牌调用 userinfo 端点,但我无法获得令牌。我收到以下错误:

  1. 客户端未授权客户端凭据流,请检查 AllowedGrantTypes 设置 - 当我使用 GrantType.Authorization 客户端配置中的代码时
  2. 客户端无法在客户端凭据流中请求 openid 范围 - 当我使用 GrantType.ClientCredentials

客户端已在 startup.cs 中设置为;

services.AddAuthentication(options =>
            {
                options.DefaultScheme = "cookie";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("cookie")
            .AddOpenIdConnect("oidc", options =>
            {
                options.Authority = ConfigurationManager.AppSettings["AuthorityUrl"];
                options.ClientId = ConfigurationManager.AppSettings["ClientId"];
                options.ClientSecret = ConfigurationManager.AppSettings["ClientSecret"];
                options.RequireHttpsMetadata = false;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.ResponseType = "code";
                options.UsePkce = true;
                options.ResponseMode = "query";

                options.Scope.Add("openid");
                options.Scope.Add("profile");
                options.SaveTokens = true;

            });

目前我的客户端配置如下;

new Client
                    {
                         ClientName = "Admin Client",
                         ClientId = "admin.client",
                         AllowedGrantTypes = GrantTypes.Code,
                         ClientSecrets = { new Secret("secretkey".Sha256()) },
                         AllowedScopes =new List<string> {
                               IdentityServerConstants.StandardScopes.OpenId,
                               IdentityServerConstants.StandardScopes.Profile
                            },
                         RedirectUris = {"https://localhost:44324/signin-oidc"},
                         FrontChannelLogoutUri = "https://localhost:44324/signout-oidc",
                         PostLogoutRedirectUris = {"https://localhost:44324/signout-callback-oidc"},

                         AllowOfflineAccess = true,
                         RequirePkce = true,
                         RequireConsent = false,
                         AllowPlainTextPkce = false

                    }

为了获得令牌,我这样做(当我在客户端配置中使用 GrantType.ClientCredentials

using var client = new HttpClient();
            var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
            {
                Address = _discoveryDocument.TokenEndpoint,
                ClientId = ConfigurationManager.AppSettings["ClientId"],
                ClientSecret = ConfigurationManager.AppSettings["ClientSecret"],
                Scope = "openid"

            });

我这样称呼用户:

var response = await client.GetUserInfoAsync(new UserInfoRequest
            {
                Address = _discoveryDocument.UserInfoEndpoint,
                Token = token
            });

但它永远不会到达用户信息。 请注意,我一直在将客户端配置中的 GrantTypes 更改为 Hybrid、AuhorizationCode,但它仍然不起作用。当我使用 AuthorizationCode grantType 和 Use RequestAuthorizationCodeTokenAsync 时,它在参数中请求代码,但我不知道如何获取授权码(抱歉,我是新手)。

请问我应该如何配置我的客户端才能请求我可以在 userinfo 端点中使用的令牌,或者有什么方法可以获取用户信息?

请帮忙。 谢谢。

要获取用户详细信息,请使用 Claims

基本上你这样称呼它

@User.Claims.FirstOrDefault(c => c.Type == "name")?.Value(在 cshtml 页面上)

User.Claims.Where(c => c.Type == "mail").First().Value(在 .cs class 上)