【发布时间】:2020-11-30 11:44:59
【问题描述】:
我正在使用 ASP.NET Identity 创建 IdentityServer4 身份验证,用于 React SPA 和具有基于策略的授权的 ASP.NET Core Web API。
Take a look at this flow diagram as I am not yet able to embed images directly into the question.
所以基本上我到目前为止所做的,
- 成功登录 Google 后,React SPA 将具有“使用 Google 登录”(“react-google-login”库)
- 收到包含 IdToken 和其他内容的“tokenObj”响应
- POST 请求,使用 Id 令牌 和一些额外的声明字段,从 React SPA 到 IdentityServer4 端点
- 使用 Google 客户端库方法 Google.Apis.Auth.GoogleJsonWebSignature.ValidateAsync 从 IdentityServer4 控制器端点验证 IdToken
- IdToken 验证成功后,使用 ASP.NET Identity UserManager 方法创建/获取用户,并且,
- 此外,在 POST 请求中传递的自定义声明会为该用户添加到数据库中
我现在想做什么,
- 从 IdentityServer4 获取“access_token”,将其传递到该 POST 请求的成功响应中。
注意:不要将 Google 提供的 access_token 传递给 React SPA。想 将 IdentityServer4 颁发的 access_token 传递给 SPA。并且访问令牌在解码时应包含该自定义声明,以进一步处理基于策略的 在另一个 API 中进行授权。 我也知道 ProfileService 是用来传递 IdentityServer4 发出的访问令牌里面的自定义声明,所以 ProfileService 我已经实现了。
所以问题主要集中在使用Google IdToken验证用户后如何通过IdentityServer4颁发的新access_token。
最小的工作示例
public class ExternalLoginModel
{
public string IdToken { get; set; }
public string UserRole { get; set; }
}
[Route("api/[controller]")]
[ApiController]
public class ExternalAuthController : ControllerBase
{
[HttpPost]
[Route("google")]
public async Task<IActionResult> AuthenticateGoogleSignin(ExternalLoginModel externalLoginModel)
{
Payload payload;
var provider = "google";
try
{
// currently no need to validate
var validationSettings = new ValidationSettings
{ Audience = new[] { "YOUR_CLIENT_ID" } };
payload = await GoogleJsonWebSignature.ValidateAsync(
externalLoginModel.IdToken, validationSettings);
// create custom claims and store claims for the user found from Google IdToken
// storing custom claims passed in request if user is created.
var userRole = externalLoginModel.UserRole;
var user = await GetOrCreateExternalLoginUser("google",
payload.Subject,
payload.Email,
userRole);
return Ok(new
{
access_token = "want_to_give_identity_server4_issued_access_token"
});
}
catch
{
// Invalid token
}
return BadRequest();
}
}
【问题讨论】:
-
我已经参考了这个github.com/mickeysden/dotnet-core-react-oauth-example/blob/… 但是在这个项目中,由于 JwtSecurityToken() 的使用方式类似,我想要来自 IdentityServer4 的访问令牌。
标签: asp.net-core asp.net-web-api asp.net-identity identityserver4