url用户登录后我需要重定向到正确的。
用户将单击其电子邮件中的 URL,如果他未通过身份验证,他将被重定向到登录页面。用户在那里输入他的凭据,并在获得授权后被重定向到returnURL.
在调试代码和调用Login controller时,returnUrl 参数是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然后我被重定向到默认页面,就像登录成功后通常那样。
谁能指出这里有什么问题?