【发布时间】:2020-05-20 11:31:09
【问题描述】:
我在我的项目中使用 jwt 令牌。当客户端登录时,他将收到一个带有他的设备 ID(在移动设备中)的令牌——该令牌已在请求正文中发送到服务器——作为有效负载......
我想要做的事情是当客户端在正文中发送他的设备 ID(作为我的项目中的约定)以及标头请求中的令牌时进一步请求,我想检查设备 ID 和令牌的有效负载是否相等。
我在这样的服务中做到了这一点:
public class AuthenticationService
{
public bool IsAuthenticated(HttpRequest req, string deviceId)
{
var token = req.Headers["authorization"];
var handler = new JwtSecurityTokenHandler();
JwtSecurityToken tokenS;
foreach (var stringValue in token)
{
var ss = stringValue.Replace("Bearer ", "");
if (handler.CanReadToken(ss))
{
tokenS = handler.ReadToken(ss) as JwtSecurityToken;
return tokenS.Claims.Any(c => c.Value == deviceId);
}
}
return false;
}
}
我应该将它注入到我想要授权用户的每个控制器中......
if (_authenticationService.IsAuthenticated(Request, deviceId))
{
_logger.LogInformation("authorized!");
}
else
{
_logger.LogCritical("unauthorized");
}
我想知道是否有更清洁的方法可以做到这一点? 配置身份验证时在 Startup 类中要做的事情:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(
Configuration.GetSection("AppSettings:Token").Value)),
ValidateIssuer = false,
ValidateAudience = false,
};
});
【问题讨论】:
-
您可以使用由所有其他控制器继承的
Base Controller,然后覆盖OnActionExecuting以在处理请求之前验证用户。这将减少样板代码。 -
为什么不在请求管道中进行,每个控制器都安装...
标签: asp.net authentication jwt asp.net-core-webapi