2012-03-02 9 views
4

I持って次のスクリプト:なぜRequest.IsAuthenticatedはfalseです

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> 
} 

という問題これはアクションです

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

Request.IsAuthenticatedは、ページを更新した後にのみtrueになります。

答えて

4

問題は次のとおりです。

要求($.post("/Account/OpenIdLogOn/"...)それが認証されていないユーザーを作る時。

アクションメソッドでは、ユーザーを認証しますが、認証Cookieを作成する前にユーザーが行った要求を表すRequestオブジェクトでは、ユーザーは認証されませんでした。しかし、あなたが次のリクエストで言うように、それはをリクエストすると、その時にユーザーは認証クッキーを持っているので動作します。

ここでの解決策の1つは、コントローラのアクションメソッドからビューに送信するビューモデルオブジェクトを作成することです。このviewModelにはauthenticatedというフィールドがあり、アクションメソッドから適切に設定できます。次に、ビュー内でこの値をチェックします。私は、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"); 
    } 

そして、あなたのビュー

はのviewmodelを作成します。

@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> 
} 

boolをモデルとして送信するのではなく、ビューモデルを作成するのは、私が常にp私がビューモデル内のビューに送るデータ。後で拡張するほうがはるかに簡単になり、ビュー内を読みやすくなります(@if (Model)の代わりに@if (Model.Authenticated)と書くことができます)

+0

ありがとうございます。 – user348173

関連する問題