Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC Owin Cookie身份验证-覆盖返回URL生成_C#_Asp.net Mvc_Model View Controller_Asp.net Mvc 5 - Fatal编程技术网

C# MVC Owin Cookie身份验证-覆盖返回URL生成

C# MVC Owin Cookie身份验证-覆盖返回URL生成,c#,asp.net-mvc,model-view-controller,asp.net-mvc-5,C#,Asp.net Mvc,Model View Controller,Asp.net Mvc 5,我有一个使用Owin Cookie身份验证的MVC应用程序。我已启用SlidingExpiration并正在工作。但是,当用户的登录过期并将其发送回登录路径时,ReturnUrl会给我带来一些问题: 我只想在ReturnUrl指向GET操作而不是POST操作时包含它 我希望包括PathAndQuery,而不仅仅是Path,这样我就可以重新填写用户可能在表单上填写的任何项目 我尝试创建我自己的AuthorizeAttribute(下面的代码),并将其应用于我的一个控制器中的一些方法,但它似乎在会话

我有一个使用Owin Cookie身份验证的MVC应用程序。我已启用SlidingExpiration并正在工作。但是,当用户的登录过期并将其发送回登录路径时,ReturnUrl会给我带来一些问题:

  • 我只想在ReturnUrl指向GET操作而不是POST操作时包含它
  • 我希望包括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 }
            });
            }
        }
    }
    

    当您想要覆盖此行为时,指示自定义属性是“标准[解决方案]”,但我似乎无法使其工作。

    看起来我已经解决了:我更改了启动配置,如下所示:

        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请求的返回URL。我使用PathAndQuery进行了测试,但到目前为止,它还导致了其他问题。目前,我想说这里的主要问题已经解决了