加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 为什么Request.IsAuthenticated是错误的

发布时间:2020-12-16 10:01:50 所属栏目:asp.Net 来源:网络整理
导读:我有以下脚本: function OpenIdLogon(e) { $.post("/Account/OpenIdLogOn/",{ token: e },function (data) { $("#userNavigation").html(data); $(".auth_box").hide(); $(".kb_fading").hide(); }); } 这是行动: public ActionResult OpenIdLogOn(string
我有以下脚本:

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中的问题仅在刷新页面后才为真.

解决方法

问题如下:

在发出请求时($.post(“/ Account / OpenIdLogOn /”…)用户未进行身份验证.

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

这里的一个解决方案是创建一个viewmodel对象,以便从您的控制器操作方法发送到您的视图.此viewModel可以有一个名为authenticated的字段,您可以从action方法中正确设置它.然后在视图中检查此值.我没有在Visual Studio中检查过这个,但它应该是这样的:

创建viewmodel:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读