簡體   English   中英

MVC Owin Cookie身份驗證-覆蓋ReturnUrl生成

[英]MVC Owin Cookie Authentication - Override ReturnUrl Generation

我有一個使用Owin Cookie身份驗證的MVC應用程序。 我啟用了SlidingExpiration並可以正常工作。 但是,當用戶的登錄名過期並將其發送回LoginPath時,ReturnUrl給我一些問題:

  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 }
        });
        }
    }
}

一個相關問題答案表明,自定義AuthorizeAttribute是“當您要覆蓋此行為時的標准[解決方案]”,但我似乎無法使其正常工作。

看來我已經弄清楚了:我按如下方式更改了啟動配置:

    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");
    }
}

現在,我僅獲得GET請求的ReturnUrl。 我使用PathAndQuery進行了測試,但到目前為止,它已經引起了其他問題。 目前,我想說這里的主要問題已經解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM