【问题标题】:How to get AuthorizationCode for RequestAuthorizationCodeTokenAsync如何获取 RequestAuthorizationCodeTokenAsync 的 AuthorizationCode
【发布时间】:2022-02-12 16:45:37
【问题描述】:

我正在实施 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;

});

我知道授权请求应该返回一个授权码(我猜是在一个回调 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);

但代码为空。

请帮忙。

谢谢

【问题讨论】:

    标签: c# asp.net-core httpclient identityserver4 openid


    【解决方案1】:

    只需阅读响应:

    if (tokenResponse.IsError)
    {
        throw new Exception("...");
    }
    string token = tokenResponse.AccessToken;
    

    我猜你是在代码参数中传递你的实际代码。

    如果您使用 Cookie 和 OpenIdConnect 处理程序,则无需调用 IdentityServer。处理程序为您完成。当您从身份提供者返回时,您的应用应该经过身份验证。

    当您使用 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");
    

    【讨论】:

    • 不,我的问题是如何将Code 参数传递给RequestAuthorizationCodeTokenAsync 方法。
    • 感谢您的编辑。解决了我的问题。只需将通过这种方式获得的访问令牌传递给 UserInfo 端点,它就可以工作了!无论如何,我还看到令牌随声明一起提供。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2016-08-05
    • 2015-05-20
    相关资源
    最近更新 更多