gpt4 book ai didi

登录请求中未设置 ASP.NET 身份

转载 作者:行者123 更新时间:2023-12-02 17:17:10 28 4
gpt4 key购买 nike

我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。

但是,在登录请求期间情况并非如此:

    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, false, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
var identity = User.Identity;

------------> // identity is of type WindowsIdentity <------------

return RedirectToLocal(returnUrl);

如您所见,即使登录成功,属性 User.Identity 尚未设置到 ClaimsIdentity 实例。我认为这是合理的,这意味着 SignInManager 不会更新属性,因此我们必须等到下一个请求才能看到登录结果。

但是,我必须在方法 PasswordSignInAsync 之后执行额外的逻辑,因此我需要一种方法来获取 .Success 中的 ClaimsIdentity 实例 switch 语句的分支。

在调试器中检查 SignInManager 时,我发现它的类型为 Microsoft.Owin.Security.AuthenticationManager,它具有属性 SignInEntry.Item1 其中包含我正在寻找的 ClaimsIdentity

但是,类型 Microsoft.Owin.Security.AuthenticationManager 不是公开的,因此唯一的方法似乎是使用反射进行破解。

有更好的方法吗?

最佳答案

我同意,PasswordSignInAsync 没有将用户实例作为输出参数返回,这太糟糕了。如果你查看源代码,你可以看到它使用 this.UserManager.FindByNameAsync(userName) 通过 userName 查找用户,然后使用 this.UserManager.CheckPasswordAsync(user, password) ) 来验证密码,但用户存储在本地变量中。

我认为这应该作为对 SignInManager 类的改进提出。

一种可能的(且低效的)解决方法是再次查询用户,然后以与 SignInManager.SignInAsync 相同的方式自己创建声明身份:

        ApplicationUser user = await UserManager.FindByNameAsync(model.Email);
ClaimsIdentity claimsIdentity = await SignInManager.CreateUserIdentityAsync(user);

关于登录请求中未设置 ASP.NET 身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832470/

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