.net-core - 在 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 方面没有太多经验,所以如果我遗漏了明显的内容,请忽略我的愚蠢。
解决方案
推荐阅读
- angular - 如何自定义离子推送通知,如来电?
- swagger - OpenApi - 无法将相同的 $ref 映射到 2 个路径
- google-chrome-os - 为什么我的光标一直卡住并开始随机点击?
- python-3.x - 如何使用熊猫将字典列表存储到excel
- python - 如何键入常量的并集
- python - 在没有用户输入的情况下在 python 脚本中安装包
- c# - 如何使用 URL 添加额外字符?
- windows - 在 windows 批处理脚本中修改数组
- wordpress - Wordpress 循环,重新排列类别帖子,每三分之二的帖子
- javascript - Javascript调用Python不打印任何东西