asp.net-mvc – 为什么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中的问题仅在刷新页面后才为真. 解决方法
问题如下:
在发出请求时($.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)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-2 – 为MVC2 AsyncControllers构建单元测试
- asp.net-mvc – 测量时间调用ASP.NET MVC控制器操作
- asp.net-core – visual studio 2015没有看到我的xunit测试
- asp.net – IIS 7.0不允许下载MP4视频
- asp.net-mvc – 是否可以将大量数据从控制器传递到MVC3中的
- asp.net – HttpWebRequest正在为404抛出异常
- asp.net-mvc – 无法在实体框架模型中的MVC 4模板中使用Use
- asp.net-mvc – ASP.Net MVC中的自我AJAX更新部分视图/控制
- asp.net-mvc – 如何自动刷新部分视图?
- asp.net – 哪里是.ASPXAUTH cookie
- asp.net-web-api – 使用WIF和OWIN中间件的角色与
- asp.net – 检查site.master页面中的条件
- asp.net-core – vNext MVC模板 – wwwroot
- asp.net – .NET JIT编译器会优化方法调用吗?
- asp.net-mvc-3 – 在ASP.NET MVC中使用多个部分时
- 扩展/覆盖现有的ASP.NET控件
- asp.net – IdentitySever3重定向多个域的URL
- asp.net-mvc-3 – 使用javascript代码访问viewba
- asp.net-mvc-3 – 关于Razor中嵌套代码块声明的问
- asp.net-mvc – 用于ninject的ASP.NET MVC 3 Pre
