如何获取 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");