我需要在用户登录后重定向到正确的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
,然后我会像登录成功后那样重定向到默认页面。
有谁可以指出这里有什么问题?