如何获取访问令牌和用户信息:使用 AspNet Identity 的 IdentityServer4
How to Get Access Token and User Info: IdentityServer4 With AspNet Identity
大家好,
所以我成功地将使用 AspNet 身份验证的 IdentityServer 4 集成到我的项目中。它在身份验证后重定向到客户端,这样就可以了。现在的问题是我想在客户端获取用户详细信息,比如他们的用户名、电子邮件、名字和姓氏。我想用令牌调用 userinfo 端点,但我无法获得令牌。我收到以下错误:
- 客户端未授权客户端凭据流,请检查 AllowedGrantTypes 设置 - 当我使用
GrantType.Authorization
客户端配置中的代码时
- 客户端无法在客户端凭据流中请求 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 上)
大家好,
所以我成功地将使用 AspNet 身份验证的 IdentityServer 4 集成到我的项目中。它在身份验证后重定向到客户端,这样就可以了。现在的问题是我想在客户端获取用户详细信息,比如他们的用户名、电子邮件、名字和姓氏。我想用令牌调用 userinfo 端点,但我无法获得令牌。我收到以下错误:
- 客户端未授权客户端凭据流,请检查 AllowedGrantTypes 设置 - 当我使用
GrantType.Authorization
客户端配置中的代码时 - 客户端无法在客户端凭据流中请求 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 上)