gpt4 book ai didi

c# - RedirectToAction 开始新 session

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:08 26 4
gpt4 key购买 nike

我有一个登录我的用户的 Controller 。假设它是现有用户并且密码正确,我检查他们是否启用了 2fa。

AccountControler登录方法

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, _configurationSettings.LockoutOnFailure);
if (result.Succeeded)
{
var user = await _userManager.FindByEmailAsync(model.Email);
await _signInManager.SignInAsync(user, _configurationSettings.IsPersistent);
_logger.LogInformation("User logged in.");
return RedirectToLocal(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToAction(nameof(Lockout));
}

ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}

// If we got this far, something failed, redisplay form
return View(model);
}

假设用户确实启用了 2fa,那么我将他们重定向到 LoginWith2fa 方法。

  [HttpGet]
[AllowAnonymous]
public async Task<IActionResult> LoginWith2fa(bool rememberMe, string returnUrl = null)
{
// Ensure the user has gone through the username & password screen first
var user = await _signInManager.GetTwoFactorAuthenticationUserAsync();

if (user == null)
{
throw new ApplicationException($"Unable to load two-factor authentication user.");
}

var model = new LoginWith2faViewModel { RememberMe = rememberMe };
ViewData["ReturnUrl"] = returnUrl;

return View(model);
}

这就是我的问题所在 var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); 总是返回 null。我放置了几个断点,看起来它在 ApplicationSignInManager 和 AccountController 中重新调用了我的构造函数。在那里给我一个新的 session 。

SignInManager 在 startup.cs 中注册为作用域

services.AddIdentity<ApplicationUser, IdentityRole<long>>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddSignInManager<ApplicationSignInManager>()
.AddDefaultTokenProviders();

如何调用 RedirectToAction 并保留相同的 session ?

我一直在关注这个项目Identity Server 4 Demo

更新:关于 HttpContext 的评论 enter image description here

最佳答案

感谢@muqeetkhan 给我提示。因为我使用的是自定义 SignInManager,所以它需要设置正确的 session cookie,以便将用户数据传播到下一页。

public class ApplicationSignInManager : SignInManager<ApplicationUser>
{

private readonly ILogger _logger;
public ApplicationSignInManager(UserManager<ApplicationUser> userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory, IOptions<IdentityOptions> optionsAccessor,
ILogger<ApplicationSignInManager> logger, IAuthenticationSchemeProvider schemes) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
_logger = logger;
}

public override async Task<SignInResult> PasswordSignInAsync(string userEmail, string password, bool isPersistent, bool shouldLockout)
{
if (UserManager == null)
return SignInResult.Failed;
var result = await new FindUserCommand(_logger, UserManager, userEmail, password, shouldLockout).Execute();

if (result != SignInResult.TwoFactorRequired) return result;

var user = await UserManager.FindByEmailAsync(userEmail);
return await SignInOrTwoFactorAsync(user, true); // Required sets the session Cookie
}
}

基本上 SignInOrTwoFactorAsync(user, true); 需要被调用。

关于c# - RedirectToAction 开始新 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47754721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com