在以前使用表单身份验证的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,但它不会将用户注销,但正如我所说,我不确定这是否是你的意图。