Как исправить то, что всегда возвращался неавторизованный статус использования [Authorize (Roles = "Manager")]? - PullRequest
0 голосов
/ 24 января 2019

Я внедряю аутентификацию на основе ролей для ядра webpi asp.net. Я почти последовал этому уроку. https://medium.com/@engr.mmohsin/asp-net-core-2-0-webapi-jwt-role-based-authentication-authorization-with-custom-tables-and-identity-401c898d9ef1

После входа в систему с учетной записью управления [Authorize(Roles = "Manager")] всегда возвращается неавторизованным.

В классе контроллера

[Route("api/[controller]")]
[Authorize(Roles = "Manager")]

Генерирующий токен в методе входа класса обслуживания

var claims = new[] {

    new Claim("Name", user.Name), 
    //few other claims
    new Claim(ClaimTypes.Role, user.Role.ToString())


        };
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));

var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(_config["Jwt:Issuer"],
          _config["Jwt:Issuer"],
          claims,
          expires: DateTime.Now.AddMinutes(30),
          signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);

В startup.cs

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidAudience = Configuration["Jwt:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
        };
    });

Кто-то, пожалуйста, объясните, в чем проблема этого кода?

HTTP-запрос e

Решено: Это не происходит с приложением кода. ИспользованиеAuthentication ()

Ответы [ 2 ]

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

Извините. Я такой тупой.
Причиной этой проблемы не является использование app.UseAuthentication();

В моем случае я случайно добавил это в область производственной среды. вроде как это ...

else if (env.IsProduction())
   {
       ....
       app.UseAuthentication();
   }

Моя программа работает в среде разработки. Так что app.UseAuthentication(); не доходит.

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

Ваш код выглядит достаточно хорошо.Когда вы отправляете токен в заголовке вашего HTTP-запроса.Вы добавили тип авторизации?

Вам нужен тип авторизации в заголовке вашего HTTP-запроса https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization

Проверьте схемы аутентификации здесь http://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml

Что вынужна схема аутентификации на предъявителя.Вы можете прочитать эту ссылку для получения дополнительной информации о специфике https://tools.ietf.org/html/rfc6750#section-2.1

Итак, ваш заголовок авторизации будет выглядеть как

httpClient.DefaultHeaders.Add("Authorization", "Bearer " + your token);

И вы можете заставить его работать с вашим текущимнастроить, используя его как

[Authorize("Bearer", (Roles = "Manager")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...