Олицетворение пользователя ASP.NET Core 1.1 с удостоверением

Застрял из-за нехватки информации при попытке реализовать функцию олицетворения пользователя с помощью Identity .Net Core. Я пытаюсь сделать этот ASP.NET Код MVC 4.6 работает в ASP.NET Core, но сталкивается с некоторыми строками кода, которые .NET Core больше не поддерживает.

Итак, ниже приведен исходный код 4.6, который нужно передать userName и войти в систему как пользователь.

public async Task ImpersonateUserAsync(string userName)
{
    var context = HttpContext.Current;

    var originalUsername = context.User.Identity.Name;

    var impersonatedUser = await userManager.FindByNameAsync(userName);

    var impersonatedIdentity = await userManager.CreateIdentityAsync(impersonatedUser, DefaultAuthenticationTypes.ApplicationCookie);
    impersonatedIdentity.AddClaim(new Claim("UserImpersonation", "true"));
    impersonatedIdentity.AddClaim(new Claim("OriginalUsername", originalUsername));

    var authenticationManager = context.GetOwinContext().Authentication; 

    authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
    authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, impersonatedIdentity);
}

Я дошел до этого, но застрял на context.GetOwinContext().Authentication части, где мне нужно выйти из системы с текущим файлом cookie и войти в систему с этим новым пользователем.

public async Task<IActionResult> ImpersonateUserAsync(string userName)
{
    var originalUsername = _httpContextAccessor.HttpContext.User.Identity.Name;

    var impersonatedUser = await _userManager.FindByNameAsync(userName);

    var impersonatedIdentity = await _userManager.CreateAsync(impersonatedUser);
    await _userManager.AddClaimAsync(impersonatedUser, new Claim("UserImpersonation", "true"));
    await _userManager.AddClaimAsync(impersonatedUser, new Claim("OriginalUsername", originalUsername));

    return RedirectToAction("Index", "Home");
}

Кто-нибудь делал с таким подходом?


person bbusdriver    schedule 29.05.2017    source источник
comment
Вы понимаете, что _userManager.AddClaimAsync добавляет утверждения о выдаче себя за другое лицо в базу данных, а не только в файл cookie? поэтому каждый раз, когда вы входите в систему с этим пользователем, это заявление о выдаче себя за другое лицо будет включаться (если вы не удалите его из БД, когда вы де-олицетворяете)   -  person trailmax    schedule 30.05.2017
comment
Хорошая точка трейлмакс. Как вы можете видеть по ссылке, они используются для определения того, выполняет ли кто-то олицетворение, и используются для отмены олицетворения пользователя обратно с правами администратора. Я должен удалить их, когда выйду из себя. Спасибо.   -  person bbusdriver    schedule 30.05.2017
comment
@trailmax Не понял, что это вы написали о выдаче себя за другое лицо в ссылке. Привет, Trailmax. Это, безусловно, отличный подход. Но все изменилось, когда дело доходит до .Net Core. SignIn больше не принимает var impersonatedIdentity. SignIn теперь можно брать только ClaimsPrincipal. Любая идея?   -  person bbusdriver    schedule 30.05.2017


Ответы (1)


Используйте 1_.

public async Task<IActionResult> ImpersonateUserAsync(string userName) {
    var context = HttpContext; //Property already exists in Controller

    var originalUsername = context.User.Identity.Name;

    var impersonatedUser = await _userManager.FindByNameAsync(userName);

    var impersonatedIdentity = await _userManager.CreateAsync(impersonatedUser);
    await _userManager.AddClaimAsync(impersonatedUser, new Claim("UserImpersonation", "true"));
    await _userManager.AddClaimAsync(impersonatedUser, new Claim("OriginalUsername", originalUsername));

    var authenticationManager = context.Authentication; 
    var cookie = DefaultAuthenticationTypes.ApplicationCookie;
    await authenticationManager.SignOutAsync(cookie);
    await authenticationManager.SignInAsync(cookie, impersonatedIdentity, 
        new AuthenticationProperties() { IsPersistent = false });

    return RedirectToAction("Index", "Home");
}

Справочная документация Использование промежуточного ПО для файлов cookie без Идентификация ASP.NET Core

person Nkosi    schedule 30.05.2017
comment
Спасибо Nkosi, я думаю, HttpContext.Authentication - это правильный путь, но SignInAsync не принимает impersonatedIdentity, вместо этого параметр может принимать только ClaimsPrincipal. Сможете ли вы сделать какое-нибудь обходное решение для этого? - person bbusdriver; 30.05.2017
comment
Выяснилось, что impersonatedIdentity используется для определения успешности операции идентификации. Поэтому я не думаю, что эта строка кода не имеет ничего общего с SignInAsync. Я хочу сказать, как правильно использовать SignInAsync для входа (олицетворения) с учетной записью пользователя, которая хранится в AspNetUsers таблице? - person bbusdriver; 30.05.2017
comment
Создайте принцип претензий и заполните его необходимыми претензиями, затем войдите в систему - person Nkosi; 30.05.2017
comment
Возможно, я могу создать список претензий var claims, например, new Claim(ClaimTypes.Name, impersonatedUser.FirstName, ClaimValueTypes.String), new Claim(ClaimTypes.Email, impersonatedUser.Email, ClaimValueTypes.String), и передать его ClaimsPrincipal, например, var user = new ClaimsPrincipal(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme));. Но я считаю, что на самом деле он не вошел в систему под учетной записью этого пользователя? похоже, это притворяется. Я хочу, чтобы администратор действительно вошел в систему как учетная запись пользователя, чтобы администратор мог видеть назначенные этому пользователю привилегии на всех страницах. - person bbusdriver; 30.05.2017
comment
_userManager.CreateAsync не создает нового пользователя? И затем AddClaimAsync хранит заявки для этого нового пользователя? - person Michael Petito; 30.08.2017