如何获取 RequestAuthorizationCodeTokenAsync 的 AuthorizationCode
How to get AuthorizationCode for RequestAuthorizationCodeTokenAsync
我正在实施 IdentityServer。我需要使用 RequestAuthorizationCodeTokenAsync 来获取可以传递给 UserInfo 端点的令牌。所以我有这样的代码:
var client = new HttpClient();
var tokenResponse = await client.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
{
Address = _discoveryDocument.TokenEndpoint,
ClientId = ConfigurationManager.AppSettings["ClientId"],
ClientSecret = ConfigurationManager.AppSettings["ClientSecret"],
Code = "code",
});
我的客户端已成功验证并重定向。那么如何从此重定向中获取 AuthorizationCode
,以便我可以将代码作为代码传递给 RequestAuthorizationCodeTokenAsync。我已经像这样设置了我的 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.Scope.Add("ois");
options.SaveTokens = true;
});
我知道授权请求应该 return 一个授权代码(我猜是在回调 URL 中),但我不知道如何获得它。
我试过使用:
Microsoft.Extensions.Primitives.StringValues code;
Microsoft.Extensions.Primitives.StringValues state;
this.Request.Query.TryGetValue("code", out code);
this.Request.Query.TryGetValue("state", out state);
但代码为空。
请帮忙。
谢谢
简单阅读回复:
if (tokenResponse.IsError)
{
throw new Exception("...");
}
string token = tokenResponse.AccessToken;
而且我猜你在代码参数中传递了你的实际代码。
如果您使用 Cookie 和 OpenIdConnect 处理程序,则无需调用 IdentityServer。处理程序会为您完成。当您从身份提供者 return 时,您的应用程序应该经过身份验证。
当您使用 SaveTokens = true
配置处理程序时,您的令牌(access_token、refresh_token 和 id_token)将保存在您的 cookie 中。
如果您需要访问您的令牌,您可以使用扩展方法 HttpContext.GetTokenAsync(string token)
:
var accessToken = await HttpContext.GetTokenAsync("access_token");
var isToken = await HttpContext.GetTokenAsync("id_token");
var refreshToken = await HttpContext.GetTokenAsync("refresh_token");
我正在实施 IdentityServer。我需要使用 RequestAuthorizationCodeTokenAsync 来获取可以传递给 UserInfo 端点的令牌。所以我有这样的代码:
var client = new HttpClient();
var tokenResponse = await client.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
{
Address = _discoveryDocument.TokenEndpoint,
ClientId = ConfigurationManager.AppSettings["ClientId"],
ClientSecret = ConfigurationManager.AppSettings["ClientSecret"],
Code = "code",
});
我的客户端已成功验证并重定向。那么如何从此重定向中获取 AuthorizationCode
,以便我可以将代码作为代码传递给 RequestAuthorizationCodeTokenAsync。我已经像这样设置了我的 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.Scope.Add("ois");
options.SaveTokens = true;
});
我知道授权请求应该 return 一个授权代码(我猜是在回调 URL 中),但我不知道如何获得它。
我试过使用:
Microsoft.Extensions.Primitives.StringValues code;
Microsoft.Extensions.Primitives.StringValues state;
this.Request.Query.TryGetValue("code", out code);
this.Request.Query.TryGetValue("state", out state);
但代码为空。
请帮忙。
谢谢
简单阅读回复:
if (tokenResponse.IsError)
{
throw new Exception("...");
}
string token = tokenResponse.AccessToken;
而且我猜你在代码参数中传递了你的实际代码。
如果您使用 Cookie 和 OpenIdConnect 处理程序,则无需调用 IdentityServer。处理程序会为您完成。当您从身份提供者 return 时,您的应用程序应该经过身份验证。
当您使用 SaveTokens = true
配置处理程序时,您的令牌(access_token、refresh_token 和 id_token)将保存在您的 cookie 中。
如果您需要访问您的令牌,您可以使用扩展方法 HttpContext.GetTokenAsync(string token)
:
var accessToken = await HttpContext.GetTokenAsync("access_token");
var isToken = await HttpContext.GetTokenAsync("id_token");
var refreshToken = await HttpContext.GetTokenAsync("refresh_token");