我正在使用React前端在ASP.NET Core 2.1应用中实现Auth0。
用户进行身份验证后,我将同时获得一个access_token
和一个id_token
。我很清楚access_token
的目的是授予对我的API方法的访问权限。我也了解id_token
提供了可以在前端应用程序中使用的用户数据。
问题/担忧是关于在进行API调用时将用户数据(例如userId
)发送到我的后端。除了在我的userId
请求的正文中包含POST
之外,还有其他方法可以将其发送到我的API方法吗?
在Auth0之前,我使用了其他一些解决方案,并且从他们那里收到的JWT token
始终包括userId
,username
等。我认为这是一种更安全的方法,因为即使可以看到JWT token
中的内容,签名也使我们可以确保数据不会受到破坏。
即使我的API调用是通过SSL
保护的,但与在userId
中发送API调用的人相比,在我的请求正文中包含JWT token
的安全性却不那么安全{1}}。
我是否在这里丢失了某些信息,还是确实通过常规方法在API调用中(即在userId
调用的正文中或在{{1}的查询字符串中)发送了POST
}致电?
答案 0 :(得分:-1)
好问的人,我上周遇到了同样的问题,最后使用相同的JWTAccessToken
来解决。
难点在于,在生成可在服务器中检索的访问令牌时,将经过身份验证的用户的 UserId 添加为声明。
添加声明以访问令牌
首先将用户的ID添加到您的声明列表中。
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("UserId", user.Id.ToString()));
然后生成访问令牌。
SecurityToken token = new JwtSecurityToken(
issuer: {YOUR_ISSUER},
audience: {YOUR_AUDIENCE},
claims: claims,
notBefore: DateTime.UtcNow,
expires: DateTime.UtcNow.AddMinutes(60),
signingCredentials: credentials
);
假设您已经知道如何从达到上述问题的oAuth
和JWT
的能力中扣除最终的代币生成之前执行这些步骤。
从访问令牌检索声明
要从其access_token读取 UserId ,我们创建几个帮助程序/扩展方法,以帮助我们从控制器的RequestContext
读取access_token。
public static string GetUserId(this ControllerBase controller)
{
string securityKey = "{YOUR_SECURITY_KEY}";
SymmetricSecurityKey key = new SymmetricSecurityKey(new UTF8Encoding().GetBytes(securityKey));
JwtSecurityTokenHandler token_handler = new JwtSecurityTokenHandler();
var tokenValidationParams = new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = key,
ValidateLifetime = false
};
string bearer = controller.HttpContext.Request.Headers["Authorization"].ToString().Replace("Bearer", string.Empty).Trim(' ');
List<Claim> claims = token_handler.ValidateToken(bearer, tokenValidationParams, out SecurityToken token).Claims.ToList();
Claim userClaim = claims.FirstOrDefault(x => x.Type == "UserId");
if(userClaim != null)
{
return userClaim.Value;
}
else
{
throw new Exception("Invalid AccessToken. UserId claim not found");
}
}
使用方法
现在让我们使用它来获取我们任意一个控制器中的 UserId :
[Authorize]
public class ExampleController : Controller
{
public IActionResult Index()
{
string userId = this.GetUserId();
// --> continuing code goes here.
}
}