我有以下脚本:
function OpenIdLogon(e) {
$.post("/Account/OpenIdLogOn/", { token: e }, function (data) {
$("#userNavigation").html(data);
$(".auth_box").hide();
$(".kb_fading").hide();
});
}
Run Code Online (Sandbox Code Playgroud)
这是行动:
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");
}
Run Code Online (Sandbox Code Playgroud)
而且,我的用户导航:
@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>
}
Run Code Online (Sandbox Code Playgroud)
Request.IsAuthenticated只有在刷新页面后才等于 true的问题。
问题如下:
在发出请求时,($.post("/Account/OpenIdLogOn/"...)用户未经过身份验证。
然后,在您的操作方法中对用户进行身份验证,但在代表用户在创建 Auth cookie 之前发出的请求的 Request 对象上,用户未经过身份验证。但是,正如您在下一个请求中所说的那样,它会起作用,因为此时用户在发出请求时拥有身份验证 cookie。
这里的一种解决方案是创建一个视图模型对象,以从控制器操作方法发送到视图。该 viewModel 可以有一个名为“authentiated”的字段,您可以从操作方法中正确设置它。然后在您的视图中检查该值。我没有在 Visual Studio 中检查过这一点,但它应该是这样的:
创建视图模型:
public class LoginViewModel{
public bool Authenticated{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你的行动方法:
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");
}
Run Code Online (Sandbox Code Playgroud)
和你的看法
@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>
}
Run Code Online (Sandbox Code Playgroud)
创建视图模型而不是仅仅发送 bool 作为模型只是因为我喜欢始终将发送到视图的数据放入视图模型中。使以后的扩展变得更容易,并且更容易在视图内阅读(您可以编写@if (Model.Authenticated)而不是@if (Model)例如)
| 归档时间: |
|
| 查看次数: |
4343 次 |
| 最近记录: |