MVC正在从响应中删除ApplicationCookie



在以前使用表单身份验证的MVC项目中,我能够使用具有以下覆盖的操作过滤器从响应中剥离身份验证cookie。

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    filterContext.HttpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
}

我现在已经切换到使用基于OWIN的asp.net身份2.0,同样,我想删除他们版本的身份验证cookie。

我已经修改了过滤器(如下)以使用新的cookie名称,但cookie不再被删除。

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    const string authenticationCookie = CookieAuthenticationDefaults.CookiePrefix + DefaultAuthenticationTypes.ApplicationCookie;
    filterContext.HttpContext.Response.Cookies.Remove(authenticationCookie);
}

有人知道为什么吗?

原因是身份验证发生在具有自己的环境字典的OWIN管道中,而您以前的FormsAuthentication使用的是System。网状物HttpContext。

如果在上设置断点

 filterContext.HttpContext.Response.Cookies

查看这个变量,你会发现它甚至没有一个名为.AspNet.ApplicationCookie的cookie,所以你没有删除任何内容。

我不确定你试图通过删除cookie而不仅仅是将用户注销来实现什么,但类似的方法是创建一个操作过滤器,如下所示:

public class CookieStripperAttribute : ActionFilterAttribute {
    public override void OnResultExecuted(ResultExecutedContext filterContext) {
        filterContext.HttpContext.GetOwinContext().Environment.Add("StripAspCookie", true);
    }
}

根据需要应用它,然后在OWIN通过创建一些OWIN中间件写出消息头之前检查操作

  public class AuthenticationMiddleware : OwinMiddleware
        {
            const string _authenticationCookie = CookieAuthenticationDefaults.CookiePrefix + DefaultAuthenticationTypes.ApplicationCookie;
            public AuthenticationMiddleware(OwinMiddleware next) :
                base(next) { }
            public override async Task Invoke(IOwinContext context)
            {
                var response = context.Response;
                response.OnSendingHeaders(state =>
                {
                    var resp = (OwinResponse)state;
                    if (resp.Environment.ContainsKey("StripAspCookie"))
                    {
                        resp.Cookies.Delete(_authenticationCookie);
                    }
                }, response);
                await Next.Invoke(context);
            }
        }

您可以在启动类中附加该中间件:

 app.Use(typeof(AuthenticationMiddleware));

请注意,虽然这会吃掉cookie,但它不会将用户注销,但正如我所说,我不确定这是否是你的意图。

相关内容

  • 没有找到相关文章

最新更新