2013-10-23 124 views
24

您能否告訴我爲什麼FormsAuthentication.SetAuthCookie(user.Name, false);不會導致Request.IsAuthenticated爲真?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(都)中添加了身份驗證,但它仍然無法正常工作。

<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或其他模式?

+0

凡(在什麼視圖)是這個'if'聲明在什麼位置? – Andrei

+0

您是否檢查過ModelSate.IsValid是否爲真?您發送到該操作的模型可能存在問題。 – James

+1

檢查你的web.config中的'authentication'元素的一切正常嗎?你可以發佈嗎? – jbl

回答

43

我在MVC5項目中遇到了同樣的問題。 解決的辦法是添加以下行到模塊部分中的system.webServer

<remove name="FormsAuthentication" /> 
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
+0

這正是我將我的項目移動到MVC 5後發生的事情。非常感謝張貼Ger。 –

+0

我在MVC5上也有這個問題。你也可以評論「刪除」標籤,就是這樣。 – user007

+0

謝謝解決我的問題也 –

3

您正在檢查用戶是否已通過身份驗證。所以使用:

if (User.Identity.IsAuthenticated) 

這將解決這個問題,正如前面提到的那樣,將web.config中的認證元素設置爲Forms而不是Windows。

+1

它適用於'User.Identity.IsAuthenticated'和'Request.IsAuthenticated',這兩者之間有什麼區別嗎?他們看起來工作一致。關鍵是將身份驗證更改爲Forms。 – Kmaczek

+5

@Kmaczek這兩者之間沒有實際區別。實際上,除了檢查User或User.Identity是否爲空之外,Request.IsAuthenticated的實現只檢查User.Identity.IsAuthenticated。所以你可以堅持'Request.IsAuthenticated'。 –

13

驗證用戶後,您必須設置FormsAuthentication.SetAuthCookie(acct.UserName, true); ,並且請檢查您是否必須在web.config中設置authentication mode="Forms"

+0

這個解決方案對我很好,我嘗試了所有其他的可能性,最後這個工作。謝謝。 – LikePod

+0

以上回聲!我也感謝你! –

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

乾杯,

1

我一直在尋找約2小時,現在要解決的問題。 而如果你已經有設置你是在一些指南(如MSDN等)告知,你仍然有這個問題,唯一的事情,這將解決這個問題是添加:

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

內webconfig。

+0

歡迎來到SO,你的問題是什麼? –

6

添加以下代碼在你的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>