Не уверен, что аутентификация JWT работает правильно - PullRequest
0 голосов
/ 19 сентября 2018

Я только что добавил аутентификацию Jwt, используя это руководство по Github https://github.com/cuongle/WebApi.Jwt. Однако я не уверен, правильно ли я ее реализовал.

Вот как я проверяю это с помощью Postman

После проверки моего пользователя я получаю токен аутентификации и вставляю его в область авторизации для другого запроса.Затем я вызываю свою следующую функцию (функцию A), которая имеет атрибут JwtAuthenticate.Результат возвращается, как и ожидалось.

Однако, когда я удаляю токен из области авторизации и повторно отправляю свой запрос функции, я все равно получаю тот же результат, как если бы я все еще проходил проверку.Я попытался открыть новую вкладку и повторил попытку, но то же самое произошло.

Я не уверен, правильно ли я это реализовал.

Это мой код

ApiController

    [HttpGet]
    [AllowAnonymous]
    public String Authenticate(String Username, String Password)
    {
        LoginDTO lgdto = new LoginDTO
        {
            Email = Username,
            Password = Password
        };
        if (accountsData.Authenticate(lgdto))
        {
            return JwtManager.JwtManager.GenerateToken(Username);
        }
        else
        {
            return AspNetEventLogs.AccessDenied;
        }
    }

    [JwtAuthenticate]
    [HttpGet]
    public String Validate()
    {
        return "Validated";
    }

Мой файл JwtAuthenticate

public class JwtAuthenticate : Attribute, IAuthenticationFilter
{
    public string Realm { get; set; }
    public bool AllowMultiple => false;

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        var request = context.Request;
        var authorization = request.Headers.Authorization;

        if (authorization == null || authorization.Scheme != "Bearer")
        {
            context.ErrorResult = new AuthenticationFailureResult("Incorrect Scheme", request);
            return;
        }

        if (string.IsNullOrEmpty(authorization.Parameter))
        {
            context.ErrorResult = new AuthenticationFailureResult("Missing Jwt Token", request);
            return;
        }

        var token = authorization.Parameter;
        var principal = await AuthenticateJwtToken(token);

        if (principal == null)
            context.ErrorResult = new AuthenticationFailureResult("Invalid token", request);

        else
            context.Principal = principal;
    }



    private static bool ValidateToken(string token, out string username)
    {
        username = null;

        var simplePrinciple = JwtManager.JwtManager.GetPrincipal(token);
        var identity = simplePrinciple?.Identity as ClaimsIdentity;

        if (identity == null)
            return false;

        if (!identity.IsAuthenticated)
            return false;

        var usernameClaim = identity.FindFirst(ClaimTypes.Name);
        username = usernameClaim?.Value;

        if (string.IsNullOrEmpty(username))
            return false;

        // More validate to check whether username exists in system

        return true;
    }

    protected Task<IPrincipal> AuthenticateJwtToken(string token)
    {
        string username;

        if (ValidateToken(token, out username))
        {
            // based on username to get more information from database in order to build local identity
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, username)
                // Add more claims if needed: Roles, ...
            };

            var identity = new ClaimsIdentity(claims, "Jwt");
            IPrincipal user = new ClaimsPrincipal(identity);

            return Task.FromResult(user);
        }

        return Task.FromResult<IPrincipal>(null);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {
        Challenge(context);
        return Task.FromResult(0);
    }

    private void Challenge(HttpAuthenticationChallengeContext context)
    {
        string parameter = null;

        if (!string.IsNullOrEmpty(Realm))
            parameter = "realm=\"" + Realm + "\"";

        context.ChallengeWith("Bearer", parameter);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...