如何向identityserver本身颁发访问令牌

本文关键字:访问令牌 identityserver | 更新日期: 2023-09-27 18:00:15

这可能是一个愚蠢的问题,但这里是:)

我在这个问题上有以下应用程序:

  • 身份服务器3
  • 使用Identity Server作为其验证器的WebApi2应用程序
  • MVC web应用程序

我想做的是从IdentityServer调用WebApi上的安全服务,但为了做到这一点,我需要一个访问令牌。

我如何在IdentityServer中向自己发出访问令牌(按顺序将通过WebApi自身进行身份验证)

如何向identityserver本身颁发访问令牌

IdentityServer包含一个OWIN扩展方法,该方法允许直接发布令牌,而无需通过其中一个协议流。

它被称为IssueClientToken,记录在这里:

https://identityserver.github.io/Documentation/docsv2/advanced/owin.html

我有相同或非常相似的要求。在我的案例中,用户请求令牌并使用外部IdP进行身份验证(这是使用身份验证代码流)。就在用户身份验证过程之后,我需要Identity Server联系安全的WebApi,在这样做的过程中,Identity Server需要一个令牌(使用客户端凭据流)

我目前的解决方案(但我仍在测试)是在自定义用户服务的AutenticateExternalAsync中进行调用。在这里,我使用TokenClient.RequestClientCredentialssync进行调用。显然,客户端需要为IdentityServer本身进行设置。

早期迹象表明,这在开发环境中可以正常工作。

我听从了@Andy的建议,这对我来说很有效:)在这里发布我的代码,让其他人看到。以下代码是在自定义用户服务中实现的。

    public override Task AuthenticateLocalAsync(LocalAuthenticationContext context)
    {
        var user = GetUsersAsync().SingleOrDefault(x => x.Username == context.UserName && x.Password == context.Password);
        if (user != null)
        {
            context.AuthenticateResult = new AuthenticateResult(user.Subject, user.Username);
        }
        return Task.FromResult(0);
    }
    private static List<CustomUser> GetUsersAsync()
    {
        var response =  GetTokenAsync();
        var result = CallUserApi(response.Result.AccessToken).Result;
        var users = JsonConvert.DeserializeObject<List<CustomUser>>(result);
        return users;
    }

    private static Task<string> CallUserApi(string token)
    {
        var client = new HttpClient();
        client.SetBearerToken(token);
        var json = client.GetStringAsync($"https://your.apiAdress.here/");
        return json;
    }
    private static Task<IdentityModel.Client.TokenResponse> GetTokenAsync()
    {
        var client = new TokenClient(
            "https://identityserver.adress.here/identity/connect/token",
            "clientId",
            "secret");
        return client.RequestClientCredentialsAsync("apiScope");
    }