2012-03-02 111 views
4

我有以下腳本:爲什麼Request.IsAuthenticated是假的

function OpenIdLogon(e) { 
     $.post("/Account/OpenIdLogOn/", { token: e }, function (data) { 
      $("#userNavigation").html(data); 
      $(".auth_box").hide(); 
      $(".kb_fading").hide(); 
     }); 
    } 

這是操作:

public ActionResult OpenIdLogOn(string token) 
     { 
      WebClient cli = new WebClient(); 
      string json = cli.DownloadString(new Uri("http://ulogin.ru/token.php?token=" + Request.Params["token"] + "&host=" + Request.Url.Host)); 
      var obj = JObject.Parse(json); 
      if (obj["error"] == null) 
      { 
       var userName = obj["nickname"].Value<string>(); 
       var email = obj["email"].Value<string>(); 
       FormsAuthentication.SetAuthCookie(userName, true);      
      } 

      return PartialView("UserNavigation"); 
     } 

而且,我的UserNavigation:

@if (Request.IsAuthenticated) 
{ 
    <a href="#" class="username"><span>@Context.User.Identity.Name</span><i class="icon iUser"></i></a> 
    <ul class="headLine_link"> 
     <li><a href="#">Profile</a></li> 
     <li> 
      @Html.ActionLink("Logg Off", "LogOff", "Account", null, new { @class = "exit" })</li> 
    </ul> 

} 
else 
{  
    <ul class="headLine_link"> 
     <li><a id="regLink">Register</a></li> 
     <li><a id="authLink">Log On</a></li> 
    </ul> 
} 

中的問題只有刷新頁面後,Request.IsAuthenticated才爲真。

回答

4

的問題是以下內容:

在做出請求($.post("/Account/OpenIdLogOn/"...)它沒有通過認證的用戶的時間。

然後在您的操作方法中對用戶進行身份驗證,但是在請求對象上代表用戶在創建身份驗證cookie之前所做的請求,該用戶未通過身份驗證。但是,正如您在接下來的請求中所說的那樣,因爲那時用戶擁有身份驗證Cookie,因此他會提出請求。

這裏的一個解決方案可以是創建一個viewmodel對象,以從您的控制器操作方法發送到您的視圖。這個viewModel可以有一個名爲authenticated的字段,你可以從action方法中正確設置它。然後在視圖中檢查這個值。我沒有在Visual Studio中檢查這一點,但它應該是這樣的:

創建視圖模型:

public class LoginViewModel{ 
    public bool Authenticated{ get; set; } 
} 

動作方法:

public ActionResult OpenIdLogOn(string token) 
    { 
     WebClient cli = new WebClient(); 
     string json = cli.DownloadString(new Uri("http://ulogin.ru/token.php?token=" + Request.Params["token"] + "&host=" + Request.Url.Host)); 
     var obj = JObject.Parse(json); 
     var viewModel = new LoginViewModel{ Authenticated = Request.IsAuthenticated }; 

     if (obj["error"] == null) 
     { 
      var userName = obj["nickname"].Value<string>(); 
      var email = obj["email"].Value<string>(); 
      FormsAuthentication.SetAuthCookie(userName, true);   
      viewModel.Authenticated = true;    
     } 

     return PartialView("UserNavigation"); 
    } 

而且你的觀點

@model LoginViewModel 
@if (Model.Authenticated) 
{ 
    <a href="#" class="username"><span>@Context.User.Identity.Name</span><i class="icon iUser"></i></a> 
    <ul class="headLine_link"> 
    <li><a href="#">Profile</a></li> 
    <li> 
     @Html.ActionLink("Logg Off", "LogOff", "Account", null, new { @class = "exit"  })</li> 
    </ul> 
} 
else 
{  
    <ul class="headLine_link"> 
    <li><a id="regLink">Register</a></li> 
    <li><a id="authLink">Log On</a></li> 
    </ul> 
} 

創建一個視圖模型,而不是隻發送一個布爾作爲模型,只是因爲我喜歡總是p請將我發送到視圖模型內的視圖的數據。使得以後擴展起來更容易,並且使得在視圖內部更容易閱讀(例如,您可以編寫@if (Model.Authenticated)而不是@if (Model)

+0

感謝您的解釋。 – user348173 2012-03-02 07:49:34