Проблема : Кажется, я не могу получить 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.
Вот учебник , который я использовал для кодирования своего приложения.