ASP.NET Core 2 - угловая и JWT-аутентификация - PullRequest
0 голосов
/ 30 июня 2018

Проблема : Кажется, я не могу получить User или любые данные, относящиеся к пользователю (например, UserID), на любом контроллере после того, как токен был записан в локальное хранилище браузера.

Я установил точку останова и изучил HttpContext член ControllerBase экземпляра (клиентское приложение делает запрос + auth_token хранится в локальном хранилище на данном этапе).

Вы можете извлечь URL реферера только из Headers, но информация о tokens.

отсутствует.

Даже если вы создаете куки для токена - у Request его нет (вообще найдено 0 куки).

Возможно, я неправильно понимаю концепцию, как работает авторизация.

Вот бит, который я больше всего неправильно понимаю - как ASP.NET Core извлекает token из запроса, сделанного клиентским приложением - он должен храниться в заголовках?

Кроме того, кто-нибудь может поделиться рабочим примером аутентификации JWT, где Angular & ASP.NET Core являются отдельными решениями?


Я реализовал функциональность входа в систему и храню токен доступа в локальном хранилище браузера.

this._authService.authenticate(this.loginModel)
  .finally(finallyCallback)
  .subscribe((result: AuthenticateOutput) => {
     localStorage.setItem('auth_token', result.token);
});

Должно ли имя токена соответствовать каким-либо соглашениям? (Интересно, подходит ли auth_token в этом случае.)

SessionController - метод, извлекающий информацию о текущем пользователе:

public async Task<GetCurrentLoginDetailsOutput> GetCurrentLoginDetails()
{
    var output = new GetCurrentLoginDetailsOutput();
    var user = await UserManager.GetUserAsync(HttpContext.User);
    if (user != null)
    {
        output.User = Mapper.Map<UserDto>(user);
        output.Tenant = Mapper.Map<TenantDto>(user.Tenant);
    }
    return output;
}

В моем Authenticate методе AuthContoller я создаю Claim, который содержит UserID:

var user = await _userService.Authenticate(input.UserName, input.Password);

var tokenDescriptor = new SecurityTokenDescriptor
{
    Issuer = _config.GetValidIssuer(),
    Audience = _config.GetValidAudience(),
    SigningCredentials = new SigningCredentials(_config.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256),
    Subject = new ClaimsIdentity(new[]
    {
         new Claim("id", user.Id.ToString())
    })
};

_userService.Authenticate метод выбирает пользователя и проверяет правильность пароля следующим образом:

var user = _context.Users.SingleOrDefault(x => x.UserName == username);

if (user == null) { return null; }

bool correctPassword = await UserManager.CheckPasswordAsync(user, password);

JWT config в Startup.cs

services
   .AddAuthentication()
   .AddJwtBearer(x =>
   {
      x.RequireHttpsMetadata = false;
      x.SaveToken = true;
      x.TokenValidationParameters = new TokenValidationParameters()
      {
          IssuerSigningKey = Configuration.GetSymmetricSecurityKey(),
          ValidAudience = Configuration.GetValidAudience(),
          ValidIssuer = Configuration.GetValidIssuer()
      };
});

CORS настроен следующим образом:

.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()


Дополнительная информация:

  • Приложение Angular - это отдельное решение / проект, а не шаблон «одного решения», доступный в VS2017.

  • Я использую ASP.NET Core v2.1

  • Я использую пакет NSwag.AspNetCore для автоматической генерации сервисов для проекта Angular.

  • Вот учебник , который я использовал для кодирования своего приложения.

...