【问题标题】:Why Request.IsAuthenticated is false为什么 Request.IsAuthenticated 是假的
【发布时间】:2012-03-02 06:17:23
【问题描述】:

我有以下脚本:

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");
        }

还有,我的用户导航:

@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只有在刷新页面后才等于true。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    问题如下:

    在发出请求时($.post("/Account/OpenIdLogOn/"...) 未经过身份验证的用户。

    然后在您的操作方法中对用户进行身份验证,但在代表用户在创建 Auth cookie 之前发出的请求的 Request 对象上,用户未经过身份验证。但是,正如您在下一个请求中所说的那样,它可以工作,因为当时用户在 发出 请求时拥有身份验证 cookie。

    这里的一个解决方案是创建一个视图模型对象,以从您的控制器操作方法发送到您的视图。这个 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>
    }
    

    创建一个视图模型而不是仅仅发送一个布尔值作为模型只是因为我喜欢总是将我发送到视图的数据放在视图模型中。使以后扩展更容易,并且更易于在视图中阅读(例如,您可以写 @if (Model.Authenticated) 而不是 @if (Model)

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      相关资源
      最近更新 更多