WebSecurity.Logout WebSecurity.IsAuthenticated == True

时间:2015-02-09 21:34:32

标签: asp.net-mvc asp.net-mvc-4 authentication

WebSecurity.IsAuthenticated之后

trueWebSecurity.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进行测试..

2 个答案:

答案 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

的情况

您对使用此类输出缓存有何看法?