1

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,我正在阅读我urlquerystring

@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然后我被重定向到默认页面,就像登录成功后通常那样。

谁能指出这里有什么问题?

4

0 回答 0