WebSecurity.IsAuthenticated
之后 true
为WebSecurity.Logout
,因为出于Cookie原因需要在更改属性之前完成响应。我再次通过javascript重定向这个原因。在第二个响应中通常也是WebSecurity.IsAuthenticated == true
。我不知道为什么。似乎随机给我。注销后获得WebSecurity.IsAuthenticated == false
的任何方式?也许这是一个缓存问题。
_Layout.cshtml
<body>
@{Html.RenderAction("Header", "Menu", new { area = "" });}
@RenderBody()
</body>
MenuController.cs
[OutputCache(Duration = 1, VaryByParam = "*")]
public class MenuController : Controller
{
[ChildActionOnly]
public ActionResult Header()
{
return PartialView("~/Views/Shared/_Header.cshtml");
}
}
Logout.cshtml
<h2>Logout</h2>
<script type="text/javascript">
$(document).ready(function () {
if ('@WebSecurity.IsAuthenticated' == "True") {
window.location.reload(true);
}
});
</script>
AccountController.cs
public ActionResult Logout()
{
if (WebSecurity.IsAuthenticated)
{
WebSecurity.Logout();
Session.Abandon();
var url = Url.Action("Logout", new { controller = "Account", area = "SomeArea" });
Response.RemoveOutputCacheItem(url);
}
return View();
}
HTTP / 1.1 200 OK Cache-Control:public,max-age = 1 Content-Type: 为text / html; charset = utf-8内容编码:gzip到期:星期一,2月16日 2015 20:47:56 GMT Last-Modified:Mon,16 Feb 2015 20:47:55 GMT Vary: Accept-Encoding Server:Microsoft-IIS / 8.0 X-AspNetMvc-Version:4.0 X-AspNet-Version:4.0.30319 X-SourceFiles: =?UTF-8 2 B 4 RDpcUHJvamVjdHNcU29mdHdhcmVcbXZjLXRlbXBcbXZjLndlYlxWZW5kb3JcQWNjb3VudFxMb2dvdXQ =?= X-Powered-By:ASP.NET Access-Control-Allow-Origin:* Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type, 接受Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS 日期:星期一,2015年2月16日20:47:54 GMT内容长度:1633 HTTP / 200响应默认是可缓存的,除非Expires,Pragma, 或Cache-Control标头存在并禁止缓存。 HTTP / 1.0 Expires Header现身:星期一,2015年2月16日20:47:56 GMT
HTTP / 1.1 Cache-Control标头存在:public,max-age = 1 public: 任何缓存都可以缓存此响应。 max-age:这个资源会 到期,02分钟。 [1秒]
HTTP / 1.1 Vary Header存在:Accept-Encoding缓存必须 除非标题的值,否则请联系服务器以验证新鲜度 named匹配生成缓存条目的请求。
注意:IE对Vary的支持有限。看到 http://fiddler2.com/r/?ievary
!!警告:VARY应指定要启用的ETAG的响应 有条件的重新确认请求。
HTTP Last-Modified标题存在:周一,2015年2月16日20:47:55 GMT 此回复未设置任何cookie。这个回复没有包含 P3P标题。
使用Chrome,Firefox进行测试..
答案 0 :(得分:1)
检查是否IsAuthenticated
并更改可见性状态。
$(document).ready(function () {
$.ajax({
type: "GET",
url: "/SomeArea/Account/IsAuthenticated",
cache: false
})
.done(function (isAuth) {
if (isAuth == "True") {
$(".auth").show();
$(".no-auth").hide();
}
else {
$(".auth").hide();
$(".no-auth").show();
}
});
});
答案 1 :(得分:0)
OutputCache
属性缓存页面/响应内容,包括您在服务器端评估@WebSecurity.IsAuthenticated
的代码段的结果。在MVC视图中,客户端脚本如下所示:
$(document).ready(function () {
if ('@WebSecurity.IsAuthenticated' == "True") {
window.location.reload(true);
}
});
当您的缓存响应被发送到浏览器时: (即使退出时)
$(document).ready(function () {
if ('True' == "True") {
window.location.reload(true);
}
});
结论: @WebSecurity.IsAuthenticated
仅在服务器上进行一次评估,然后作为响应正文的一部分进行缓存,用于OutputCache
期间内的每个后续请求不受任何参数的影响。
解决方案: [OutputCache(VaryByHeader="Cookie",Duration=1)]
或从控制器方法中删除OutputCache
属性。
您可以做的另一件事是使用唯一参数重定向到退出页面:
$(document).ready(function () {
if ('@WebSecurity.IsAuthenticated' == "True") {
window.location = window.location + '&uniqueParameter=' + GenerateRandom();
}
});
function GenerateRandom()
{
...
}
以上内容适用于您当前OutputCache
属性设置为VaryByParam
您对使用此类输出缓存有何看法?