Я использую токены jwt в своем проекте. Когда клиент входит в систему, он получит токен с идентификатором своего устройства (в мобильном телефоне), который был отправлен на сервер в теле запроса, в качестве полезной нагрузки ...
То, что я хочу сделать, это для дальнейшие запросы, когда клиент отправляет свой идентификатор устройства в теле (как соглашение в моем проекте) и, конечно, токен в запросе заголовка, я хочу проверить, равны ли идентификатор устройства и полезная нагрузка токена.
Я сделал это в сервисе, подобном этому:
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");
}
Я хочу знать, что, если есть более чистый способ сделать это? Что нужно сделать в классе запуска при настройке аутентификации:
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,
};
});