Проверка токена JWT - PullRequest
       11

Проверка токена JWT

0 голосов
/ 30 января 2019

Я пытаюсь выполнить проверку 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;

И у меня есть несколько контроллеров, на которых я хочу выполнить проверку.Пожалуйста, дайте мне знать, как я могу выполнить эту проверку вне и перед действиями (в фильтр действий или другим способом) при отправке токена в качестве параметра для метода проверки.

1 Ответ

0 голосов
/ 30 января 2019

В нашей 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)
...