То, что я хочу получить, - это другая реализация SignInManager
в зависимости от имени пользователя, когда создается инжектор зависимостей.Для того чтобы зарегистрировать пользователя в зависимости от типа провайдера.
public class LDAPSignInManager : SignInManager<IdentityUser>
{
public LDAPSignInManager(UserManager<IdentityUser> userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<IdentityUser> claimsFactory, IOptions<IdentityOptions> optionsAccessor, ILogger<SignInManager<IdentityUser>> logger, IAuthenticationSchemeProvider schemes) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
}
...
}
public class ActiveDirectorySignInManager : SignInManager<IdentityUser>
{
public ActiveDirectorySignInManager(UserManager<IdentityUser> userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<IdentityUser> claimsFactory, IOptions<IdentityOptions> optionsAccessor, ILogger<SignInManager<IdentityUser>> logger, IAuthenticationSchemeProvider schemes) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
}
...
}
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<SignInManager<IdentityUser>>(ctx => {
var httpContext = ctx.GetService<IHttpContextAccessor>();
string userViewModelSerialized = GetUserFromCurrentRequest(httpContext.HttpContext.request.body);//{"user":"John","Password": "asddc"}
string typeProvider = GetUserProvider(userName);
switch (typeProvider)
{
case "LDAPUser":
return LDAPSignInManager(...);
case "ActiveDirectoryUser":
return ActiveDirectorySignInManager(...);
default:
return SignInManager(...);
}
});
}
public HomeController(SignInManager<IdentityUser> signInManager){
{
_signInManager = signInManager;
}
public async Task<IActionResult> SignInUser([body]UserViewModel user)
{
await _signInManager.PasswordSignInAsync(user,...); //Can be AD,LDAP...
return Ok();
}
}
Для этого мне нужно удалить имя пользователя из текущего запроса IHttpContextAccesor.HttpContext.request.body
.Это означает, что промежуточное программное обеспечение mvc в действии не находит данные в теле, и я не получаю запрос в контроллере действий.
- Как я могу
GetUserFromCurrentRequest()
без ущерба для модели связывателядействия / контроллера SignInUser? - Как получить тот же механизм связывания модели (UserViewModel), который используется в параметрах действия, чтобы иметь возможность использовать его в
GetUserFromCurrentRequest()
. - .Я вижу, что
UserViewModel
придется десериализовать дважды (один раз в ioc, а другой в действии SignInUser).Возможно ли, что он будет десериализован только один раз и затем повторно использован в Action / Controller? - Правильно ли использовать в контейнере, проверяющем запрос каждый раз?Есть ли способ монтировать контейнер только при вызове определенного маршрута, например "/ login / SignInUser"?