我正在尝试执行经过身份验证的Web api请求,该请求不会重置身份验证Cookie超时。在MVC世界中,我将通过从响应中删除FormsAuthenication cookie来实现此目的:
Response.Cookies.Remove(System.Web.Security.FormsAuthentication.FormsCookieName);
在Web API 2中,我编写了一个自定义的IHttpActionResult,我从响应中删除了Set-Cookie标头。但是,这不是删除标头,因为在为使用此操作结果的请求更新auth cookie时,我仍然会看到Set-Cookie标头。
这是自定义IHttpActionResult:
public class NonAuthResetResult<T> : IHttpActionResult where T: class
{
private HttpRequestMessage _request;
private T _body;
public NonAuthResetResult(HttpRequestMessage request, T body)
{
_request = request;
_body = body;
}
public string Message { get; private set; }
public HttpRequestMessage Request { get; private set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var msg = _request.CreateResponse(_body);
msg.Headers.Remove("Set-Cookie");
return Task.FromResult(msg);
}
}
如何在Web API 2中编辑响应标头,因为这不起作用。
答案 0 :(得分:8)
Global.asax可以删除Application_EndRequest事件中的cookie。并且您可以设置一个变量,以便稍后由Application_EndRequest选取。
步骤1.创建一个动作过滤器,在Context.Items中设置变量:
public class NoResponseCookieAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
System.Web.HttpContext.Current.Items.Add("remove-auth-cookie", "true");
}
}
步骤2.在global.asax文件中处理Application_EndRequest事件。如果存在步骤1中的变量,请删除cookie。
protected void Application_EndRequest()
{
if (HttpContext.Current.Items["remove-auth-cookie"] != null)
{
Context.Response.Cookies.Remove(System.Web.Security.FormsAuthentication.FormsCookieName);
}
}
步骤3.使用自定义过滤器装饰您的web api操作:
[NoResponseCookie]
public IHttpActionResult GetTypes()
{
// your code here
}
答案 1 :(得分:1)
如果您使用的是Web API 2,那么您可能正在使用OWIN Cookie中间件。您所描述的内容听起来像是要禁用auth cookie上的滑动到期窗口。
在标准Web API模板中,您应该有一个App_Start / Startup.Auth.cs。在它里面你会找到这条线......
app.UseCookieAuthentication(new CookieAuthenticationOptions());
这可以启用和配置cookie中间件。您可以传递一些选项来更改超时窗口并禁用滑动到期...
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
SlidingExpiration = false,
ExpireTimeSpan = new TimeSpan(1, 0, 0) // 1 hour
});