首页 > 解决方案 > 在 adfs 2012 r2 使用 oauth2.0 协议的情况下如何获取新的访问令牌

问题描述

我创建了一个 .NET Core Web 应用程序,它将充当代理并与不同的身份提供者通信,以使用 OpenId Connect 和 Oauth2.0 协议进行身份验证和授权。我正在使用Microsoft.AspNetCore.Authentication包。现在我正在尝试使用 ADFS 和 OAuth(使用带有 ADFS 3.0 的 Windows Server 2012 R2)。我们的登录服务可以成功验证并获得访问令牌和刷新令牌。但是我找不到使用中间件使用现有刷新令牌获取新 access_token 的方法。

对于其他外部 IDP 提供商,我使用以下代码从之前的刷新令牌中获取新的 access_token 、 id_token 和 refresh_token 。

            string authorityUrl = configuration.GetValue<string> 
           ("AuthProvider:Authorization");
        var discoveryRequest = new DiscoveryDocumentRequest()
        {
             Address = authorityUrl,
             Policy = new DiscoveryPolicy
             {
                ValidateEndpoints = false,
                ValidateIssuerName = false
             },
            }
        };

        var serverClient = _httpClientFactory.CreateClient();
        var discoveryDocument = await serverClient.GetDiscoveryDocumentAsync
            (discoveryRequest);
       
        var accessToken = await HttpContext.GetTokenAsync("access_token");
        var idToken = await HttpContext.GetTokenAsync("id_token");
        var refreshToken = await HttpContext.GetTokenAsync("refresh_token");
        var refreshTokenClient = _httpClientFactory.CreateClient();

        var tokenResponse = await refreshTokenClient.RequestRefreshTokenAsync(
            new RefreshTokenRequest
            {
                Address = discoveryDocument.TokenEndpoint,
                RefreshToken = refreshToken,
                ClientId = configuration.GetValue<string>("AuthProvider:ClientId"),
                ClientSecret = configuration.GetValue<string>("AuthProvider:ClientSecret"),
                GrantType = "refresh_token",
                Scope ="openid"
            });

        var authInfo = await HttpContext.AuthenticateAsync("Cookies");

        authInfo.Properties.UpdateTokenValue("access_token", tokenResponse.AccessToken);
        authInfo.Properties.UpdateTokenValue("id_token", tokenResponse.IdentityToken);
        authInfo.Properties.UpdateTokenValue("refresh_token", tokenResponse.RefreshToken);

        await HttpContext.SignInAsync("Cookies", authInfo.Principal, authInfo.Properties);

        Token token = new Token();
        token.access_token = tokenResponse.AccessToken;
        token.id_token = tokenResponse.IdentityToken;
        token.refresh_token = tokenResponse.RefreshToken;
        
        return Ok(token);
    }

但是当我请求新的 access_token 时,此代码不适用于 adfs 3.0。我在 ADFS 和 .NETCore 方面没有太多经验,所以如果我遗漏了明显的内容,请忽略我的愚蠢。

标签: .net-coreoauth-2.0openid-connectrefresh-tokenadfs3.0

解决方案


推荐阅读