Как аутентифицировать заголовок запроса, токен JWT - PullRequest
1 голос
/ 27 апреля 2019

Слушай, у меня есть угловой проект с 7 фронтами и основной веб-API asp.net.после того, как я создаю веб-токен JWT из веб-API, я возвращаюсь к фронтэнду, и он сохраняется в локальном хранилище.после того как я хочу отправить запрос в веб-API, я добавлю веб-токен JWT в часть заголовка запроса.это будет работать нормально.поэтому я хочу аутентифицировать запрос, используя данные полезной нагрузки JWT.Мои данные полезной нагрузки JWT содержат имя пользователя для регистрации, некоторую информацию о роли пользователя.Я хочу проверить, что это действительный токен, когда получить информацию о продукте по http получить запрос.Можете ли вы помочь мне для аутентификации в основной веб-API asp.net.

основной веб-API Asp.net, Angular 7 cli

Startup.cs - WEB API

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"]))
 };
});

services.AddMvc();

Создание веб-токена - WEB API

private string BuildToken(MYWebApi.Models.CustomerModel user)
{
  var claims = new[] {
  new Claim(JwtRegisteredClaimNames.NameId,user.CusId.ToString()),
  new Claim(JwtRegisteredClaimNames.Sub,user.CusName),
  new Claim(JwtRegisteredClaimNames.Email,user.CusEmail),
  new Claim("role","user"),
};

 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);
}

Помещение токена в заголовок - FRONT END

 @Injectable( )
    export class TokenInterceptorService implements HttpInterceptor{

      constructor(private injector:Injector) { }

      intercept(req, next){
        let serverService = this.injector.get(ServerService)
        let tokenizedReq = req.clone({
            setHeaders:{
              Autherization:`Bearer ${serverService.getToken()}`
            }
         })
        return next.handle(tokenizedReq)
      }
    }

Контроллер - WEB API

[Route("GetProduct")]
        [HttpGet]
        public List<ProductModel> GetProduct(int productId)
        {
            var repo = new MEData.Repository.ProductRepo();

            var productData = repo.GetProduct(productId);

            return productData;
        }

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Попробуйте следующие параметры ниже, в дополнение к app.UseAuthentication() call:

1. Примените атрибут [Authorize] с AuthenticationSchemes

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Route("GetProduct")]
[HttpGet]
public List<ProductModel> GetProduct(int productId)
{
   //...
}

Кроме того, попробуйте добавить следующую строку в ConfigureServices

services.AddAuthorization();

2. Попробуйте использовать services.AddAuthorization с политиками и выбранной схемой

services.AddAuthorization(options =>
{
    options.AddPolicy("Jwt", policy =>
    {
        policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
    });
});

Затем используйте политику, используя атрибут [Authorize]

[Authorize(Policy = "Jwt")]
[Route("GetProduct")]
[HttpGet]
public List<ProductModel> GetProduct(int productId)
{
   //...
}

В общем, я думаю, что строка services.AddAuthorization обязательна.Посмотрите, какой из вариантов работает для вас.

0 голосов
/ 27 апреля 2019

Убедитесь, что у вас есть app.UseAuthentication(); код, добавленный до app.UseMvc(); в методе Configure класса запуска

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {

            app.UseAuthentication();

            app.UseMvc();
        }

А затем также добавьте атрибут [Authorize] на уровне действия или контроллера в соответствии с вашими требованиями

...