gpt4 book ai didi

c# - SignInManager.PasswordSignInAsync() 成功,但 User.Identity.IsAuthenticated 为 false

转载 作者:行者123 更新时间:2023-11-30 21:30:18 26 4
gpt4 key购买 nike

我是 ASP.Net Core 的新手,正在尝试创建用户身份验证系统。我正在使用 ASP.Net Core Identity 用户管理。我有以下用于登录用户的代码。

/Areas/Identity/Pages/Account/Login.cshtml.cs

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");

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(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);

if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
_logger.LogInformation(User.Identity.IsAuthenticated.ToString());

return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}

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

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});

services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
});

services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

// Use a unique identity cookie name rather than sharing the cookie across applications in the domain.
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = Configuration["CookieName"];
});

// Add SAML SSO services.
services.AddSaml(Configuration.GetSection("SAML"));

services.AddTransient<IPasswordHasher<IdentityUser>, CustomPasswordHasher>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();

app.UseAuthentication();

app.UseMvc(routes =>
{
routes.MapRoute(
"default",
"{controller=Home}/{action=Index}/{id?}");
});
}

我需要在用户登录时在 cookie 中设置一些属性,但我总是得到 User.Identity.IsAuthenticated false 即使它显示 User在记录器中登录PasswordSignInAsync 成功。如何在 OnPostAsync 中登录用户?

注意:PasswordSignInAsync 成功后重定向到主页时,用户已登录。

我已经检查过这个 question但这并没有解决我的问题。

最佳答案

对于User.Identity.IsAuthenticated,它只对PasswordSignInAsync之后的子请求有效。

您可以尝试以下选项:

  1. 重定向到另一个操作以设置 cookie。

    public class LoginModel : PageModel
    {
    private readonly SignInManager<IdentityUser<int>> _signInManager;
    private readonly ILogger<LoginModel> _logger;

    public LoginModel(SignInManager<IdentityUser<int>> signInManager, ILogger<LoginModel> logger)
    {
    _signInManager = signInManager;
    _logger = logger;
    }

    //rest code

    public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
    returnUrl = returnUrl ?? Url.Content("~/");

    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(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
    if (result.Succeeded)
    {
    _logger.LogInformation("User logged in.");
    return LocalRedirect($"~/Identity/Account/Login?handler=SetIdentity&returnUrl={returnUrl}");
    }
    if (result.RequiresTwoFactor)
    {
    return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
    }
    if (result.IsLockedOut)
    {
    _logger.LogWarning("User account locked out.");
    return RedirectToPage("./Lockout");
    }
    else
    {
    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    return Page();
    }
    }

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

    public async Task<IActionResult> OnGetSetIdentityAsync(string returnUrl)
    {
    _logger.LogInformation(User.Identity.IsAuthenticated.ToString());

    return LocalRedirect(returnUrl);
    }
    }
  2. 使用_signInManager.CreateUserPrincipalAsync

    public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
    returnUrl = returnUrl ?? Url.Content("~/");

    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(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
    if (result.Succeeded)
    {
    var user = await _signInManager.UserManager.FindByEmailAsync(Input.Email);
    var userPrincipal = await _signInManager.CreateUserPrincipalAsync(user);
    var identity = userPrincipal.Identity;
    return LocalRedirect(returnUrl);
    }
    if (result.RequiresTwoFactor)
    {
    return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
    }
    if (result.IsLockedOut)
    {
    _logger.LogWarning("User account locked out.");
    return RedirectToPage("./Lockout");
    }
    else
    {
    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    return Page();
    }
    }

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

关于c# - SignInManager.PasswordSignInAsync() 成功,但 User.Identity.IsAuthenticated 为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54547742/

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