url
用户登录后我需要重定向到正确的。
用户将单击其电子邮件中的 URL,如果他未通过身份验证,他将被重定向到登录页面。用户在那里输入他的凭据,并在获得授权后被重定向到returnURL
.
在调试代码和调用Login controller
时,returnUr
l 参数是null
,即使我在发送电子邮件之前设置了它:
var queryString = @Url.Action("Index", "Details", new System.Web.Routing.RouteValueDictionary(new { id = model.Ticket.TicketId }), "http", Request.Url.Host);
var ticketUrl = "<a href='"
+ @Url.Action("Index", "Details", new System.Web.Routing.RouteValueDictionary(new { id = model.Ticket.TicketId, returnUrl = queryString }), "http", Request.Url.Host)
+ "'>Go to your ticket</a>";
var email = EmailHelper.SendEmail(model.Ticket.TicketId, ticketUrl);
电子邮件链接包含url
我需要重定向到的内容。
在 中login form
,我正在阅读我url
的querystring
:
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "LoginForm", returnUrl = Request.QueryString["returnUrl"] }))
我注意到,应用程序正在使用从类CustomAuthorizeAttribute
扩展的AuthorizeAttribute
类。
在这堂课中,我试图检索我的returnUrl
:
string returnUrl = filterContext.RequestContext.HttpContext.Request.QueryString["returnUrl"];
并且能够这样做。
这是完整的代码CustomAuthorizeAttribute
:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
string returnUrl = filterContext.RequestContext.HttpContext.Request.QueryString["returnUrl"];
HttpContext ctx = HttpContext.Current;
Controller controller = filterContext.Controller as Controller;
if (ApplicationSession.GetUser() == null)
{
UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);
string loginURL = urlHelper.Action("Index", "Login");
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.Result = new JsonResult
{
Data = new
{
Error = "SessionExpired",
LoginURL = loginURL
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else if(!string.IsNullOrEmpty(returnUrl))
{
filterContext.Result = new RedirectResult(returnUrl);
}
else
{
filterContext.Result = new RedirectResult(loginURL);
}
}
}
}
我注意到这个类被调用了两次。
当我单击电子邮件中的链接时第一次调用它,它具有returnUrl
价值,但它不会重定向到正确的controller
,即使它符合Redirect
逻辑的代码行
else if(!string.IsNullOrEmpty(returnUrl))
{
filterContext.Result = new RedirectResult(returnUrl);
}
相反,它会碰到另一个扩展ActionNameSelectorAttribute
类的类,然后返回到CustomAuthorizeAttribute
类
filterContext.RequestContext.HttpContext.Request.QueryString["returnUrl"]
变成null
然后我被重定向到默认页面,就像登录成功后通常那样。
谁能指出这里有什么问题?