Как войти в систему пользователя с другой учетной записи, когда он уже вошел в свою? - PullRequest
0 голосов
/ 12 декабря 2018

Пользователь вошел в систему под учетной записью «А» через личность

signInManager.PasswordSignInAsync(UserName, Password, false, lockoutOnFailure: true);

Вот так я выполняю выход из системы

await signInManager.SignOutAsync();

, и он работает нормально, но когда я хочу "выбросить "текущего пользователя на другой аккаунт - аккаунт" B "

await signInManager.SignInAsync(user, true);

, тогда он не работает, пользователь все еще находится на своем" предыдущем "аккаунте" A "

Даже если я выполняю

await _signInManager.SignOutAsync();

await signInManager.SignInAsync(user, true);

тогда мой пользователь все еще находится в своей "предыдущей" учетной записи "A".

В целом это странно, потому что это работало в течение последних X месяцев, и я понятия не имею, что не так, потому чтоошибки нет.

В основном использование

await _signInManager.SignOutAsync();

работает корректно, но при использовании со входом - нет.

Даже выполнение

foreach (var cookie in Request.Cookies.Keys)
{
    Response.Cookies.Delete(cookie);
}

до входа в систему не помогает

Редактирование

Вот как я могу зарегистрировать и настроить идентификатор:

services.AddEditedDefaultIdentity<User>
(
    o =>
    {
        o.Password.RequireDigit = true;
        o.Password.RequireLowercase = true;
        o.Password.RequireUppercase = true;
        o.Password.RequireNonAlphanumeric = true;
    }
)
.AddSignInManager()
.AddEntityFrameworkStores<Context>();

services.ConfigureApplicationCookie(options =>
{
    options.AccessDeniedPath = "/Login";
    options.Cookie.Name = "MyApp";
    options.Cookie.HttpOnly = true;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(600);
    options.LoginPath = "/Login";
    options.LogoutPath = "/Logout";

    options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
    options.SlidingExpiration = true;
});

public static IdentityBuilder AddEditedDefaultIdentity<TUser>(this IServiceCollection services, Action<IdentityOptions> configureOptions) where TUser : class
{
    services.AddAuthentication(o =>
    {
        o.DefaultScheme = IdentityConstants.ApplicationScheme;
        o.DefaultSignInScheme = IdentityConstants.ExternalScheme;
    })
    .AddIdentityCookies(o => { });

    return services.AddIdentityCore<TUser>(o =>
    {
        o.Stores.MaxLengthForKeys = 128;
        configureOptions?.Invoke(o);
    })
    .AddDefaultTokenProviders();
}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Решение:

Проблема возникла из-за того, что удостоверение создавало ДВА куки с идентификатором сеанса? User?не уверен

но по какой-то причине у них были разные пути

Итак,

  • Я вхожу в учетную запись A

  • Он создает cookie для учетной записи A

  • Я "катаюсь" / "вхожу" в учетную запись B

  • Он создает файл cookie для учетной записи B

  • Я ввожу конечную точку [Авторизовать]

  • , и он сначала читает?cookie для учетной записи A

  • Затем я удаляю cookie учетной записи

  • Страница обновления

  • и теперь я нахожусь на счете B.

enter image description here

Поэтому я должен попытаться исправить путь к этим созданным файлам cookie.

edit

Fix:

services.ConfigureApplicationCookie(options =>
{
    (...)
    options.Cookie.Path = "/";
});
0 голосов
/ 13 декабря 2018

Вот рабочая демонстрация для меня:

public async Task<IActionResult> SignInAnother()
{
    //A sign in with username and password
    var AsignInResult = await _signInManager.PasswordSignInAsync("tony@outlook.com","1qaz@WSX", false, true);
    //A sign out
    await _signInManager.SignOutAsync();
    //query identity user by username
    var username = "test@outlook.com";
    var user = await _userManager.FindByNameAsync(username);
    //sign in user
    await _signInManager.SignInAsync(user, isPersistent: true);
    return RedirectToAction("Index");
}
...