Я пытаюсь создать собственный поставщик удостоверений для использования в моем базовом приложении asp. net, которое использует мой устаревший код для проверки имени пользователя и пароля.
Эта статья https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-custom-storage-providers?view=aspnetcore-3.1 объясняет архитектуру и предлагает переписать только слой "store" и "data", более того, реализуя только те интерфейсы, которые вам нужны.
Но эти интерфейсы не имеют никаких методов входа / выхода из системы , Может быть, эту операцию нужно выполнить на верхнем уровне, уровне «IdentityManager»? (UserManager)
Мне нужны (пока) только функции входа / выхода, но я не могу понять, где реализовать эти методы. Любая идея или предложение?
[EDITED]
как Фэй Хан предложил мне, я пытаюсь реализовать пользовательский SignInManager
. Я сделал следующее с успехом:
пользовательский SignInManager
:
public class MySignInManager : SignInManager<IdentityUser>
{
private readonly UserManager<IdentityUser> _userManager;
private readonly ApplicationDbContext _db;
private readonly IHttpContextAccessor _contextAccessor;
public MySignInManager(
UserManager<IdentityUser> userManager,
IHttpContextAccessor contextAccessor,
IUserClaimsPrincipalFactory<IdentityUser> claimsFactory,
IOptions<IdentityOptions> optionsAccessor,
ILogger<SignInManager<IdentityUser>> logger,
ApplicationDbContext dbContext,
IAuthenticationSchemeProvider schemeProvider,
IUserConfirmation<IdentityUser> userConfirmation
)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemeProvider, userConfirmation)
{
_userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
_contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
_db = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
}
public override async Task<SignInResult> PasswordSignInAsync(string userName, string password, bool rememberMe, bool shouldLockout)
{
SignInResult result;
if (userName == "pippo" && password == "pippo")
{
return SignInResult.Success;
}
else
{
return SignInResult.Failed;
}
}
}
, затем я зарегистрировал его в startrup.cs
public void ConfigureServices(IServiceCollection services)
{
services. ... .AddSignInManager<MySignInManager>();
this Механизм РАБОТАЕТ!
При входе в систему запускается метод PasswordSignInAsync
в моем пользовательском SignInManager! Но при последующих вызовах API, HttpContext.User.Identity
является нулевым.
, поэтому первый вопрос:
1) я должен установить идентичность в контексте на моем собственный (явно)? и если да, то где?
Я изучил исходный код в официальном. net репозитории ядра https://github.com/dotnet/aspnetcore/tree/master/src/Identity и заметил, что:
реализация SignInManager
https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Core/src/SignInManager.cs ведет себя более или менее как моя (точнее говоря, она не устанавливает HttpContext.User.Identity
внутри себя) Так что, во-первых, я что HttpContext.User.Identity
было установлено вызывающей стороной SignInManager.PasswordSignInAsync
(сразу после, в случае успешного входа в систему). Для "звонящего" я имею в виду на странице входа в систему.
, но я заметил, что на странице входа в систему. net основной официальный репозиторий https://github.com/dotnet/aspnetcore/blob/master/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Login.cshtml.cs ничего не установлено после вызов SignInManager.PasswordSignInAsync
.
, поэтому следующий вопрос:
2) Какова связь между SignInManager
и HttpContext.User.Identity
? , вероятно, я пропустить кусок.