Как получить привязку ViewModel из тела запроса IHttpContextAccessor Net Core 2.1 MVC? - PullRequest
0 голосов
/ 08 февраля 2019

То, что я хочу получить, - это другая реализация 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 в действии не находит данные в теле, и я не получаю запрос в контроллере действий.

  1. Как я могу GetUserFromCurrentRequest() без ущерба для модели связывателядействия / контроллера SignInUser?
  2. Как получить тот же механизм связывания модели (UserViewModel), который используется в параметрах действия, чтобы иметь возможность использовать его в GetUserFromCurrentRequest().
  3. .Я вижу, что UserViewModel придется десериализовать дважды (один раз в ioc, а другой в действии SignInUser).Возможно ли, что он будет десериализован только один раз и затем повторно использован в Action / Controller?
  4. Правильно ли использовать в контейнере, проверяющем запрос каждый раз?Есть ли способ монтировать контейнер только при вызове определенного маршрута, например "/ login / SignInUser"?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...