Я пытаюсь выполнить проверку JWT для каждого действия, кроме действий «Вход» и «Регистрация», но я не могу найти способ сделать это в фильтрах действий, так как мне нужен токен, и он находится в this.Request.Headers. Это метод проверки, который отлично работает:
try
{
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
string sToken = token.Substring(7, token.Length - 7);
if (!tokenHandler.CanReadToken(sToken))
{
return false;
}
JwtSecurityToken jwtToken = tokenHandler.ReadToken(sToken) as JwtSecurityToken;
if (jwtToken == null)
{
return false;
}
TokenValidationParameters parameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
RequireExpirationTime = true,
ValidAudience = "http://localhost",
ValidIssuer = "http://localhost",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.Default.GetBytes(StandardValues.SecretKey))
};
SecurityToken securityToken;
ClaimsPrincipal principal = tokenHandler.ValidateToken(sToken, parameters, out securityToken);
if (principal == null)
{
return false;
}
}
catch (Exception ex)
{
return false;
}
return true;
И у меня есть несколько контроллеров, на которых я хочу выполнить проверку. Пожалуйста, дайте мне знать, как я могу выполнить эту проверку вне и перед действиями (в фильтр действий или другим способом) при отправке токена в качестве параметра для метода проверки.
пожалуйста, включите больше контекста, как указал @DaveC.





В нашем ASP.Net WebApi мы используем следующее для проверки наших токенов:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = $"https://{Configuration.GetValue<string>("AppServiceNameOutput")}",
ValidAudience = $"https://{Configuration.GetValue<string>("AppServiceNameOutput")}",
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration.GetValue<string>("SigningKey"))),
};
options.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
var tokenBlackList = context.HttpContext.RequestServices.GetRequiredService<ITokenBlackList>();
var tokenParser = context.HttpContext.RequestServices.GetRequiredService<ITokenParser>();
var bearer = context.HttpContext.Request.Headers["Authorization"];
if (String.IsNullOrEmpty(bearer))
{
bearer = context.Request.Query["access_token"];
}
var token = tokenParser.GetBearerTokenFromAuthHeaderString(bearer);
if (tokenBlackList.TokenIsBlackListed(token).Result)
{
context.Fail("Token has expired");
}
return Task.CompletedTask;
}
};
});
Затем для каждого действия контроллера мы указываем, должна ли конечная точка быть авторизована или нет, и каким политикам разрешен доступ.
[Authorize(Policy = "ManagerOnly")]
[HttpPost]
public IActionResult Update([FromBody] UpdateAppRequest request)
Спасибо, этот пример идеален! Кроме того, метод проверки возвращает логическое значение. Если false, то пользователь должен быть перенаправлен на страницу входа в систему. Можно ли это сделать отсюда?
Ну, вызов запросов с недопустимым токеном вернет код ответа 403, если я не ошибаюсь. Не уверен, как вы могли бы справиться с перенаправлением, хотя. Возможно, проверьте каждый ответ в вашем приложении.
Ты прав. Однако он вернет 401, что идеально подходит для перенаправления с внешнего интерфейса.
Откуда вызывается этот блок кода?