Пользовательская авторизация в Asp.net Core 2.1 Web API - PullRequest
0 голосов
/ 06 декабря 2018

Я бы хотел перехватывать каждый веб-запрос, поступающий в API, во время каждого запроса я хотел бы вызвать написанную мной функцию, которая сообщала бы мне о том, что у пользователя есть действующий лицензионный ключ с истекшим сроком действия.Пара вещей, которые мне понадобятся, это одна, чтобы иметь возможность идентифицировать пользователя, я мог бы сделать это, развернув токен JWT, мне понадобится доступ к этому токену, а также мне потребуется возможность вызывать методы из одного из моих классов, которыйуже зарегистрированы для инъекций с использованием автофака.Я знаю, что есть фильтры действий и промежуточное программное обеспечение, с которым я могу связываться, но у меня не было большого опыта использования любого из них, я ищу лучший способ сделать это, возможно, даже укажу на какой-нибудь пример.О, и я также должен быть в состоянии знать маршрут, есть пара методов API, которые освобождены от этой проверки.Если проверка считает, что я, очевидно, захочу сгенерировать запрос, возможно, сгенерировать ошибку 401 или что-то в этом роде.

1 Ответ

0 голосов
/ 08 декабря 2018

Я настоятельно рекомендую курс 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 Использование фильтров действий

Вы можете:

  • проверить лицензионный ключ с помощью утверждения в фильтре действий

  • Определить текущий маршрут API с помощью ActionExecutingContext

ВотПример получения заявок пользователей, а также разрешения служб из фильтра действий:

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...