2016-02-11 6 views
2

У меня есть приложение MVC с использованием аутентификации Owin Cookie. У меня включен и работает SlidingExpiration. Тем не менее, когда Войти пользовательская истекает, и они отправляются обратно в LoginPath, то ReturnUrl дает мне некоторые проблемы:MVC Owin Cookie Authentication - Override ReturnUrl Generation

  1. Я хочу только ReturnUrl быть включены, если он указывает на действие GET, не POST-действие.
  2. Я хотел бы включить PathAndQuery вместо простого Path, чтобы я мог повторно заполнить все элементы, которые пользователь мог бы заполнить в форме.

Я попытался создать свой собственный AuthorizeAttribute (код ниже) и применить его к некоторым методам в одном из моих контроллеров, но кажется, что он никогда не ударяется, когда сессия истекла.

public class CheckLoginExpirationFilter : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      string returnUrl = null; 
      if (filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.CurrentCultureIgnoreCase)) 
       returnUrl = filterContext.HttpContext.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.SafeUnescaped); 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary() 
     { 
      { "client", filterContext.RouteData.Values[ "client" ] }, 
      { "controller", "Security" }, 
      { "action", "Login" }, 
      { "ReturnUrl", returnUrl } 
     }); 
     } 
    } 
} 

answer to a related question указывает, что обычай AuthorizeAttribute является «стандартным [решение], если вы хотите изменить это поведение,» но я не могу заставить его работать.

ответ

2

Похоже, я понял это: я изменил мой запуска конфигурации следующим образом:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Security/Login"), 
      CookieSecure = CookieSecureOption.SameAsRequest, 
      SlidingExpiration = true, 
      CookieName = "Program.Auth", 
      ExpireTimeSpan = TimeSpan.FromSeconds(15)/*FromHours(1)*/, 
      Provider = new CookieAuthenticationProvider { OnApplyRedirect = CustomRedirect } 
     }); 

     // TODO - Figure out what claims type to base this on. 
     AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Email; 
    } 

    private static void CustomRedirect(CookieApplyRedirectContext context) 
    { 
     var redirectUrl = context.Options.LoginPath.ToString(); 
     if (context.Request.Method == WebRequestMethods.Http.Get) 
     { 
      var returnUrl = context.Request.Path.ToString(); 
      if (!string.IsNullOrEmpty(returnUrl) && !returnUrl.Equals("/")) 
       redirectUrl += "?" + context.Options.ReturnUrlParameter + "=" + returnUrl; 
     } 
     else if (context.Request.Method == WebRequestMethods.Http.Post) 
     { 
      //TODO: add toastr message showing that the post did not succeed 
     } 
     context.Response.Redirect(redirectUrl + "?tbn=inactive"); 
    } 
} 

Теперь я только получить ReturnUrl для запросов GET. Я тестировал с PathAndQuery, но до сих пор он вызывал другие проблемы. На данный момент я бы сказал, что главная проблема здесь решена.

Смежные вопросы