Сомнение в использовании идентификатора для ASP.NET Основной веб-API

#c# #asp.net #asp.net-core #asp.net-core-webapi

#c# #asp.net #asp.net-ядро #asp.net-core-webapi

Вопрос:

Я работаю над веб-API, и я не уверен, допустил ли я ошибку, избегая использования системы Identity членства и внедряя собственную настройку аутентификации.

Из того, что я прочитал, похоже, что это отличное решение для входа в систему на основе интерфейса, такого как Facebook, где вы можете UserManager легко использовать различные CRUD для пользователей и т. Д., Но я также видел, что он используется другими людьми для их веб-API.

Я не избегал этого исключительно из-за верхнего абзаца, а из-за следующего отрывка из этого официального документа.

 Identity is enabled for the application by calling UseIdentity in the Configure method of the Startup class. This adds cookie-based authentication to the request pipeline.
  

Это может показаться странным, но зачем мне аутентификация на основе файлов cookie для веб-API? Мне удалось защитить его с помощью пользовательских таблиц входа / утверждений и аутентификации на предъявителя JWT, и вот как я это сделал.

Вот как мне удалось реализовать пользовательские таблицы пользователей / утверждений.

Таблица идентификаторов пользователя (уменьшенная версия таблиц AspNetUsers из контейнера идентификаторов)

 public class UserIdentity
    {
        public Guid Id { get; set; }
        public string Username { get; set; }
        public string HashPassword { get; set; }
    }
  

Претензии пользователя (уменьшенная версия AspNetUserClaims)

 public class UserClaims
    {
        public Guid Id { get; set; }
        public string ClaimType { get; set; }
        public string ClaimValue { get; set; }

        [Required]
        public virtual UserIdentity UserIdentity { get; set; }
    }
  

Это мой DbContext (обратите внимание, что я использовал DbContext вместо IdentityDbContext )

 public class CustomContext : DbContext
    {
        public CustomContext(DbContextOptions<CustomContext> options)
            : base(options)
        {
        }

        public DbSet<UserIdentity> Users { get; set; }
        public DbSet<UserClaims> UserClaims { get; set; }
        // other custom DSets...
          ....
    }
  

И мой контроллер JWT

 [HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Get([FromForm] ApplicationUser applicationUser)
{
    var identity = await GetClaimsIdentity(applicationUser, _customContext);
    if (identity == null)
    {
        _logger.LogInformation($"Invalid username ({applicationUser.UserName}) or password ({applicationUser.Password})");
        return BadRequest("Invalid credentials");
    }

    var claims = new[]
    {
new Claim(JwtRegisteredClaimNames.Sub, applicationUser.UserName),
new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
//identity.FindFirst("Diamond")
identity.Claims.Last()
};
  

И в GetClaimsIdentity я просто получаю все утверждения пользователя из переданного экземпляра DbContext от контроллера CTOR .

 private static Task<ClaimsIdentity> GetClaimsIdentity(ApplicationUser user, CustomContext customContext)
        {
            var currentUser = partnerContext.Users.FirstOrDefault(x => x.HashPassword == user.Password amp;amp; x.Username == user.UserName);

            if (currentUser != null)
            {
                //Getting the user claims
                var listOfClaims =
                    from claim in partnerContext.UserClaims.Where(x => x.UserIdentity.Id == currentUser.Id)
                    select new Claim(claim.ClaimType, claim.ClaimValue);

                if (!listOfClaims.Any())
                    return Task.FromResult<ClaimsIdentity>(null);

                return Task.FromResult(new ClaimsIdentity(new GenericIdentity(user.UserName, "Token"),
                    listOfClaims));
            }

            return Task.FromResult<ClaimsIdentity>(null);
        }
  

Этот подход работает, но он заставляет меня немного запутаться, правильно ли я сделал выбор для IdentityDbContext отказа только из-за возможности «аутентификации на основе файлов cookie».

Я также читал о настройке ваших собственных пользовательских хранилищ, но в итоге у меня возникают те же сомнения: зачем мне нужна «аутентификация с использованием файлов cookie», чего мне не хватает?

Комментарии:

1. Вы пробовали запускать свое приложение без этого UseIdentity() метода? По-прежнему должно быть возможно добавить службы идентификации services.AddIdentity(...) в ConfigureServices метод, а затем не добавлять identity в конвейер.

2. И, если не добавлять его в конвейер, это может привести к изменению поведения файлов cookie? Мне еще предстоит найти что-либо подробное о том, как аутентификация с использованием файлов cookie выполняется во всей системе идентификации. Я вернусь с обновлением, удалив ‘app. UseIdentity()’

3. Я только что попытался сделать это в своем приложении, и это вызывает ошибки. Извините за это.