[英]Redirect to ReturnUrl after successful cookie authentication in Owin, Katana & Nancy
[英]MVC Owin Cookie Authentication - Override ReturnUrl Generation
我有一個使用Owin Cookie身份驗證的MVC應用程序。 我啟用了SlidingExpiration並可以正常工作。 但是,當用戶的登錄名過期並將其發送回LoginPath時,ReturnUrl給我一些問題:
我嘗試創建自己的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.