#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. Я только что попытался сделать это в своем приложении, и это вызывает ошибки. Извините за это.