User.Identity.IsAuthenticated 即使在成功的表单身份验证和 setauthcookie 之后也是错误的

User.Identity.IsAuthenticated is false even after successful form authentication and setauthcookie

我有两个控制器 TokkenIssuer 和 Login。 我在 TokkenIssuer 中对方法 A 使用了 [authorize],它进入登录控制器的视图,然后进入登录控制器的登录操作。

登录控制器:

public ActionResult Login(string user,string password,string returnUrl)
    {
        FormsAuthentication.SetAuthCookie(user, true);
        if (FormsAuthentication.Authenticate(user, password))
        {

            if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null)
                returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery);

            return RedirectToAction("B", "TokenIssuer");
        }
        return View();
    }

我正在从登录重定向到令牌发行者控制器中的操作 B。 我知道 User.Identity.IsAuthenticated 将在重定向到另一个控制器后变为 true,但我无法获取用户对象,也无法在我的重定向控制器 (TokenIssuer) 中找到 User.Identity.IsAuthenticated 为 true。

TokenIssuer 控制器

[Authorize]
    public ActionResult A()            //takes to Login view
    {
     return View();       
    }
    public ActionResult B()           //Redirected from Login controller
    {
       if(User.Identity.IsAuthenticated)                  // Getting False
        {
           string user = User.Identity.Name;
        }
    }

如何解决这个问题?

找问题花了很多时间。

我了解到,在 VS 2013 或更高版本中,当我们默认创建 Web 应用程序时,它会在 web.config 文件中添加以下代码,禁用基于表单/声明的身份验证来创建用户对象。

<module>
    <remove name = "FormsAuthentication"/>
</module>

所以评论或 Remove.This 帮助了我。

在下一次请求之前为假。

这里有一个很好的解释:http://forums.asp.net/t/1177741.aspx

简而言之,用户对象在 ASP.NET 管道中较早设置,远早于执行请求的 ASP.NET 页面代码。现在,在随后的访问中,ASP.NET 运行时将看到表单身份验证票证并且 User.Identity.IsAuthenticated 将为真,但不会在此请求上。

参考:https://www.experts-exchange.com/questions/28063988/User-Identity-IsAuthenticated-is-false-after-a-successful-Login-Validation.html