使用AuthorizeAttribute时,当从电子邮件正文重定向到指定的URL时,returnUrl为null

时间:2018-02-05 17:10:33

标签: c# asp.net-mvc authorize-attribute returnurl

我需要在用户登录后重定向到正确的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,然后我会像登录成功后那样重定向到默认页面。

有谁可以指出这里有什么问题?

0 个答案:

没有答案