【问题标题】:Why are my AJAX requests not extending an OWIN MVC session?为什么我的 AJAX 请求没有扩展 OWIN MVC 会话?
【发布时间】:2016-01-15 17:49:03
【问题描述】:

我们有一个 ASP.NET MVC 5 应用程序,它一直在使用带有滑动过期的表单身份验证。我们最近切换到 OWIN Cookie 身份验证,但遇到会话无法正常扩展的问题。

以前,可以从 AJAX xhr 请求扩展会话。但是,使用这种配置,它们不会扩展。对于每个应该扩展的请求(GET 和 POST),我都会收到 200,即使在服务器终止会话之后也是如此。

当前设置是:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
   AuthenticationType = "Cookies",
   CookieSecure = CookieSecureOption.SameAsRequest,
   CookieName = Constants.CatalystPortalCookieName,
   LoginPath = new PathString(url.Action(nameof(LoginController.Index), "Login")),
   SlidingExpiration = true,
   ExpireTimeSpan = TimeSpan.FromMinutes(20),
   CookiePath = "/",
});

但是,如果我单击导致整个页面作为文档响应加载的链接,则服务器会正​​确扩展会话。

【问题讨论】:

  • 您是否使用 session.abandon 来终止会话/注销?如果是这样,那不是 OWIN 的正确方法。使用 OWIN,您应该使用 AuthenticationManager.SignOut 方法
  • 如果您查看响应标头,您是否看到诸如 no-cache set 之类的东西?如果是这样,您可能会遇到 cookie 冲突问题:katanaproject.codeplex.com/…
  • 打开fiddler 并检查请求/响应可能值得。
  • 你是如何调用 ajax 请求的?一定要在使用jQuery时指定cache:false;
  • 你找到答案了吗?

标签: c# ajax asp.net-mvc owin session-timeout


【解决方案1】:

我最终有一些错误的假设。 AJAX 请求正在扩展。 200 的返回让我失望。在用 fiddler 查看实际响应后,我看到随着更改为 OWIN,响应中实际上移动了 401:

X-Responded-JSON: {"status":401,"headers":{...foo...}}

所以,我们最终只是将响应状态设置回 401。这可能很糟糕,但它符合我们的需求。

protected void Application_EndRequest() {
    var context = new HttpContextWrapper(Context);
    var header = context.Response.Headers["X-Responded-JSON"];
    if (header != null && header.Contains("\"status\":401")) {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }

这可能是一个更强大的解决方案:OWIN: unauthorised webapi call returning login page rather than 401

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多