MVC Owin Cookie 身份验证 - 覆盖 ReturnUrl 生成
本文关键字:覆盖 ReturnUrl 生成 身份验证 Owin Cookie MVC | 更新日期: 2023-09-27 18:34:09
>我有一个使用Owin Cookie身份验证的MVC应用程序。我已启用滑动过期并正常工作。但是,当用户的登录过期并且他们被发送回登录路径时,ReturnUrl 给我带来了一些问题:
- 我只希望包含指向 GET 操作而不是 POST 操作的 ReturnUrl。
- 我想包含 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进行了测试,但到目前为止,它已经引起了其他问题。目前,我想说这里的主要问题已经解决。