将token参数添加到asp.net mvc 2站点内的所有URL

时间:2011-12-13 10:56:30

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

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

您可以通过扩展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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-1)

您可以将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();
    }
}

希望这会有所帮助