我将一些用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参数。 谢谢你的帮助。
答案 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();
}
}
希望这会有所帮助