IsAuthenticated всегда имеет значение false в пользовательском атрибуте авторизации (. NET Core 2.2 и Jason Web Token) - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь создать свой собственный атрибут авторизации, используя Jason Web Token JWT in. net core 2.2.

Я вызываю авторизованный API с использованием Почтальон и здесь я сталкиваюсь с двумя проблемами:

  1. Заявки в отправленном JWT сообщения не принимаются
  2. IsAuthenticated всегда ложно в User.Identity.IsAuthenticated.

Обратите внимание, что часть JWT работает совершенно нормально, создается JWT, как я хочу, с правильным Claims, и я проверил его на https://jwt.io .

Что касается моего Startup.cs Я использую app.UseAuthentication()

Вот как я добавляю JWTAuthentication к services:

        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x=>
        {
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = true,
                ValidateAudience = false
            };
        });
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<AppIdentityDbContext>()
            .AddDefaultTokenProviders();

А вот фрагмент MyCustomAuthorizationAttribute.cs

    public string Permissions { get; set; } //Permission string to get from controller

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        //Validate if any permissions are passed when using attribute at controller or action level
        if (string.IsNullOrEmpty(Permissions))
        {
            //Validation cannot take place without any permissions so returning unauthorized
            context.Result = new UnauthorizedResult();
            return;
        }


        //The below line can be used if you are reading permissions from token
        var permissionsFromToken = context.HttpContext.User.Claims.Where(x => x.Type == "Permissions").Select(x => x.Value).ToList();

        var requiredPermissions = Permissions.Split(','); //Multiple permissiosn can be received from controller, delimiter "," is used to get individual values
        foreach (var x in requiredPermissions)
        {
            if (permissionsFromToken.Contains(x))
                return; //User Authorized. Wihtout setting any result value and just returning is sufficent for authorizing user
        }

        context.Result = new UnauthorizedResult();
        return;
    }

Примечание: Я знаю, что этот вопрос задавался много раньше, но я пытался большинство из них, но у меня ничего не получалось .

1 Ответ

1 голос
/ 20 января 2020

Я обнаружил, что порядок размещения сервисов промежуточного программного обеспечения в Startup.cs имеет значение. Как мы можем видеть в фрагменте кода выше. Я использую промежуточное программное обеспечение AddIdentity() после использования AddAuthentication() и AddJwtBearer(), которое каким-то образом удаляло провайдера аутентификации JWT.

Решением было просто поставить промежуточное программное обеспечение AddIdentity() со всеми его подчиненными методами до AddAuthentication() и AddJWTBearer() промежуточное программное обеспечение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...