【问题标题】:Add token parameter to all urls inside an asp.net mvc 2 site将令牌参数添加到 asp.net mvc 2 站点内的所有 url
【发布时间】:2011-12-13 10:56:29
【问题描述】:

我已经将一些用 ASP.NET MVC 2 编写的页面集成到一个经典的 webform 应用程序中。 除身份验证系统外,一切正常。

身份验证系统正在使用一些添加到 url 中的令牌,例如:

/Account/Profil/Details.aspx?AUTHID=2ddc098a-cf0b-fd81-afb7-d41f35010b9f

当我到达我的 asp.net mvc 页面时(所有这些页面都必须受到保护),它们必须包含该 AUTHID 参数。

我正在使用核心 Webform 控件来保护页面,并且该控件会检查 url 中的 AUTHID 令牌。所以基本上我的路线必须包括

?AUTHID=2ddc098a-cf0b-fd81-afb7-d41f35010b9f

最好和最聪明的方法是什么? 我不想在所有控制器操作中手动传递 AUTHID 参数。 感谢您的帮助。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-2 authentication


    【解决方案1】:

    您可以通过扩展 ASP.NET 路由机制来解决您的问题。只需创建一个自定义路由并覆盖 GetVirtualPath 函数。

    public class TokenizedRoute : Route
    {
      public TokenizedRoute(string url, IRouteHandler routeHandler) : base(url, routeHandler)
      {
      }
    
      public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
      {
        string tokenValue = "your token value";
        values.Add("AUTHID", tokenValue);
    
        return base.GetVirtualPath(requestContext, values);
      }
    }
    

    更多详情请见my blog post

    【讨论】:

      【解决方案2】:

      您可以使用 jQuery 解决方案将标记附加到所有链接的查询字符串:

      $("a").each(function (index, link)
      {
          $(link).attr("href", $(link).attr("href") + "?AUTHID=" + token);
      });
      

      但我同意 dknaack 的观点,我想说如果可能的话,你应该重新考虑你的身份验证逻辑。

      【讨论】:

        【解决方案3】:

        您可以将 AuthId 保存在 Session 对象中并创建自定义授权属性。

        属性

        public class CustomAuthorize : AuthorizeAttribute
        {
            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                // your custom logic depending on Session["AuthId"]
                return httpContext.Session["AuthId"] != null;
            }
        }
        

        控制器

        public class MyController : Controller
        {
            [CustomAuthorize]
            public ActionResult MyActionMethod()
            {
                return View();
            }
        }
        

        希望这会有所帮助

        【讨论】:

        • 不幸的是,我无法将 AUTHID 保存到会话中并检查会话,因为处理身份验证的控件将参数检查到 url。基本上我需要更改我所有的 url 并包含该 AUTHID。希望它有意义。
        • 您可以更改您的身份验证逻辑,或者在我的回答中同时使用实现。我会创建一个自定义类,这样你就没有两次逻辑,而是从你的控件和自定义属性中调用它。
        • 这不是问题的答案。他要求添加到路由/url,会话不是其中的一部分。
        猜你喜欢
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 2011-11-03
        • 2016-11-19
        • 2013-09-23
        相关资源
        最近更新 更多