Я настоятельно рекомендую курс Udemy Нила Каммингса Создание приложения с ASPNET Core и Angular From Scratch
Образец решения включает в себя лицензию MIT.
В этом 28-часовом курсе и связанном с ним решении используются:
- JWT-токены и Microsoft.AspNetCore.Identity для аутентификации
- IAsyncActionFilter для:
- перехвата веб-запросов
- чтение пользовательских утверждений
- разрешение служб из Microsoft.Extensions.DependencyInjection
Следующие разделы непосредственно связаны с тем, что вы пытаетесь выполнить:
3.26 Создание конкретного хранилища аутентификации и метод регистрации
3.27 Создание метода входа в хранилище
3.29Создание метода Register в нашем контроллере аутентификации
3.32 Аутентификация токена
Клиент отправляет токен на сервер.Сервер не использует базу данных для проверки пользователя, он сам проверяет токен.
3.33 Создание метода входа в API
Заявки добавляются в токенздесь:
AuthController.cs
public class AuthController : ControllerBase
{
[HttpPost("login")]
public async Task<IActionResult> Login(UserForLoginDto userForLoginDto)
{
…
return Ok(new {
token = GenerateJwtToken(appUser).Result,
user = userToReturn});}
}
private async Task<string> GenerateJwtToken(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName)
};
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
var key = new SymmetricSecurityKey(Encoding.UTF8
.GetBytes(_config.GetSection("AppSettings:Token").Value));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
3.34 Использование промежуточного программного обеспечения аутентификации
JwtBearerDefaults.AuthenticationScheme
зарегистрировано в DIздесь:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII
.GetBytes(Configuration.GetSection("AppSettings:Token").Value)),
ValidateIssuer = false,
ValidateAudience = false
};
});
}
}
4.39 Введение в Angular Services
Токен пользователя сохраняется в локальном хранилище в браузере при успешном входе в систему:
auth.service.ts
export class AuthService {
login(model: any) {
return this.http.post(this.baseUrl + ‘login’, model).pipe(
map((response: any) => {
const user = response;
if(user) { localStorage.setItem(‘token’, user.token);}}));}}
6.55 Использование библиотеки JWT Angular для декодирования токенов
Добавляет свойство для декодированного токена в authService.ts
13.134 Использование фильтров действий
Вы можете:
ВотПример получения заявок пользователей, а также разрешения служб из фильтра действий:
public class LogUserActivity : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var resultContext = await next();
var userId = int.Parse(resultContext.HttpContext.User
.FindFirst(ClaimTypes.NameIdentifier).Value);
var repo = resultContext.HttpContext.RequestServices.GetService<IDatingRepository>();
var user = await repo.GetUser(userId, true);
user.LastActive = DateTime.Now;
await repo.SaveAll();
}
}