27

你能告诉我为什么FormsAuthentication.SetAuthCookie(user.Name, false);不导致Request.IsAuthenticated是真的吗?

这是我的代码:

[HttpPost]
    public ActionResult LogIn(karcioszki.Models.UserLoginModel  user)
    {
        if (ModelState.IsValid)
        {
            if (IsValid(user.Name, user.Password))
            {
                FormsAuthentication.SetAuthCookie(user.Name, false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", "Login or password is incorrect");
            }
        }

        return View(user);
    }

和 if 语句:

@if (Request.IsAuthenticated)
{
    <a href="@Href("~/")" class="active">Home</a>
    <a href="@Href("~/Cards")">Cards</a>
    @Html.ActionLink("Log out", "Logout", "User")
    @Html.Encode(User.Identity.Name)
}

另外,请告诉我,如何使它工作?

编辑:我在 web.config(both) 中添加了身份验证,但它仍然无法正常工作。

<system.web>
<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5" />
<authentication mode="Windows"/>
<pages>
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
    <add namespace="System.Web.Optimization" /> 
  </namespaces>
</pages>

我应该使用 Windows 还是其他模式?

4

10 回答 10

49

我在 MVC5 项目中遇到了同样的问题。解决方案是将以下几行添加到 system.webServer 的模块部分

<remove name="FormsAuthentication" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
于 2014-07-09T09:34:41.657 回答
16

您必须FormsAuthentication.SetAuthCookie(acct.UserName, true); 在验证用户后设置,请检查您必须authentication mode="Forms"在 web.config 中设置。

于 2014-04-17T12:29:07.373 回答
10

在您的 Web.config 中添加以下代码

<authentication mode="Forms">
  <forms loginUrl="~/_Login/Login" timeout="30" />
</authentication>

  <modules>
  <remove name="FormsAuthentication" />
  <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
</modules>
于 2016-01-11T10:24:24.383 回答
2

您正在检查用户是否已通过身份验证。所以使用:

if (User.Identity.IsAuthenticated) 

这将解决问题,并且如前所述,将 web.config 中的身份验证元素设置为 Forms 而不是 Windows。

于 2013-10-23T09:40:55.833 回答
1

我的MVC4 Web Application. 此问题的另一个可能原因是IdentityModels.cs文件中的以下方法

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
                            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
                            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
                            // Add custom user claims here
                   return userIdentity;
    }

确保DefaultAuthenticationTypesApplicationCookie

干杯,

于 2015-07-09T07:18:17.917 回答
1

我现在正在寻找大约 2 个小时来解决问题。如果您已经按照几个指南(如 MSDN 等)告诉您的设置,但您仍然遇到问题,唯一可以解决的问题是添加:

<system.webServer>
  <modules>
     <remove name="FormsAuthentication" />
     <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
  </modules>
<system.webServer>

在 webconfig 中。

于 2015-10-28T13:53:05.867 回答
1

就我而言,这是 Chrome 浏览器的问题。我刚刚删除了所有存储和工作的 cookie。

于 2018-09-11T17:41:00.760 回答
0

我通过删除浏览器中的缓存和cookie来解决它。

于 2020-02-25T09:15:33.597 回答
0

在我的情况下,我遇到了这个问题,最终出现在重定向循环中,用户将被重定向到登录名,成功登录,然后返回我们的网站,但由于 Request.IsAuthenticated 为假,用户被重定向到登录名。

在我们的例子中,这是通过使用另一个 CookieManager 解决的,

var cookieOptions = new CookieAuthenticationOptions();
cookieOptions.CookieManager = new SystemWebCookieManager(); 
app.UseCookieAuthentication(cookieOptions);

事实证明,这个其他 CookieManager 解决了 Katana 中的某种错误,以防万一这解决了问题。

https://github.com/aspnet/AspNetKatana/wiki/System.Web-response-cookie-integration-issues

于 2020-04-06T12:04:35.230 回答
0

去做就对了

     <system.web>
    <authentication mode="Forms">
      <forms cookieless="UseCookies" loginUrl="~/User/Login" slidingExpiration="true"> 
   </forms>
    </authentication>
..........
.......
  </system.web>
于 2020-08-09T21:58:27.967 回答