c# - MVC Owin Cookie 身份验证 - 覆盖 ReturnUrl 生成

标签 c# asp.net-mvc model-view-controller asp.net-mvc-5

我有一个使用 Owin Cookie 身份验证的 MVC 应用程序。我启用了 SlidingExpiration 并正在工作。但是,当用户的登录过期并且他们被发送回 LoginPath 时,ReturnUrl 给我带来了一些问题:

  1. 我只希望在 ReturnUrl 指向 GET 操作时包含它,不是 POST 操作。
  2. 我想包含 PathAndQuery 而不仅仅是 Path,这样我就可以重新填写用户可能已在表单中填写的任何项目。

我尝试创建自己的 AuthorizeAttribute(下面的代码)并将其应用于我的一个 Controller 中的某些方法,但似乎在 session 过期时它永远不会被命中。

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 是“标准 [解决方案],当您想覆盖此行为时”,但我似乎无法让它工作。

最佳答案

看来我明白了:我按如下方式更改了启动配置:

    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 进行了测试,但到目前为止它一直在引起其他问题。目前,我想说这里的主要问题已经解决了。

关于c# - MVC Owin Cookie 身份验证 - 覆盖 ReturnUrl 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35342725/

相关文章:

c# - 为 Windows 应用商店应用程序崩溃分析手动生成 .appxsym 和 .appxupload 是否安全?

c# - 在文件/目录上设置时间戳非常慢

c# - Ninject 的 UnitOfWork 模式应该使用什么选项

java - Tomcat 和 Spring MVC - 未找到具有 URI 的 HTTP 请求的映射

objective-c - Mac OS X 开发的替代范例

c# - 在 C# 中获取 String.indexof 之后的字符串

c# - 在 WinForms 中保持对控件的全局引用以访问 GUI 线程

c# - 客户端自定义数据注释验证

asp.net-mvc - VB.Net 中的 ASP.Net session

java - 应该如何修改这个类才能遵循 DIP(依赖注入(inject)原则)?