. net настраиваемый провайдер идентификации - реализация функций входа / выхода - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать собственный поставщик удостоверений для использования в моем базовом приложении 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? , вероятно, я пропустить кусок.

1 Ответ

1 голос
/ 01 мая 2020

Мне нужна (пока) только функция входа / выхода, но я не могу понять, где реализовать эти методы. Любая идея или предложение?

SignInManager in ASP. NET Core Identity предоставляет API-интерфейсы для входа в систему и выхода из нее, вы можете попытаться реализовать клиентский SignInManager и переопределите соответствующие методы для настройки функций входа / выхода из системы в соответствии с вашими фактическими требованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...