2010-05-26 59 views
4

FHI,asp.net MVC和门户一样的功能

我需要类似功能的一些门户网站,在请求中PARAM将indentify门户网站建立一个网站。像这样http:/域/控制器/行动/门户

现在我的问题是,如果一个门户网站不存在必须重定向到其他网站/页面和用户可以登录到一个门户网站,但如果用户来到其他门户网站时,用户必须重定向到该门户网站的登录页面。

我现在有一些工作,但我觉得在管道中必须有一个中心位置来处理这个问题。我当前的解决方案使用自定义操作筛选器来检查门户参数,并查看门户是否存在,并检查用户是否登录该门户(用户登录的门户位于身份验证cookie中)。我在application_postauthentication事件中创建自己的IIndentiy和IPrincipal。

我有2个问题,我目前的做法:

1:这不是真正的执行,我必须将属性添加到所有控制器和/或行动。

2:对用户进行身份验证并不真正有效,我希望能够正常工作。但为此,当我创建我的IPrincipal/IIndenty时,我需要访问路线的参数,我似乎无法找到正确的位置来执行此操作。

希望有人能给我一些指点, 理查德。

回答

0

您可以通过控制器中的属性强制执行用户授权。您可以将其应用于每个操作(包括get和post)。我认为为控制器中的每个动作添加一些验证来编写安全代码是合理的,如果我在这里出错,请纠正我的错误。

+0

它的一个选项,这就是我现在正在做的。但我认为它不是正确的方法,因为它实际上是一个应用程序范围广泛的事物,而不是控制器级别的。换句话说,我认为应用程序必须执行规则,如果门户不存在重定向,甚至不打算尝试去某个控制器。它应该更像是路由不存在,并且没有去哪里但重定向。对于用户身份也是如此,如果他要去一个他没有登录的门户,它不应该被授权给漏洞应用程序。 – Richard 2010-05-26 12:40:08

1

有几种不同的方式可以做到这一点(一如既往...)。如果你想在控制器(或通过属性)中执行它,但你也想在全局执行它,那么你总是可以使用一个自定义的基本控制器类并在那里应用逻辑。 actionfilterattribute是继承人,bob是你的叔叔。

另一方面,这真的感觉就像我的路由问题。所以我可能会考虑创建一个自定义路线来处理你在做什么。如果你这样做,那么一旦你得到它的工作,你会想要在负载下测试它,以确保你有一个好的缓存策略(以便每个请求不是一个数据库查找的路线+另一个无论在控制器中发生什么)。

0

对于缺少门户重定向,我会处理这个路由。如果您的门户数量相对较少,则可以通过为每个控制器创建唯一路由,然后为重定向设置默认路由来完成此操作。路由按照您创建的顺序进行评估,因此只需将默认路由放在底部。您的路线注册会是这个样子:

routes.MapRoute(
     "Portal1", 
     "{controller}/{action}/FirstPortal", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "FirstPortal"} 
    ); 

routes.MapRoute(
     "Portal2", 
     "{controller}/{action}/SecondPortal", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "SecondPortal"} 
    ); 

routes.MapRoute(
     "Default", 
     "{controller}/{action}", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "Default"} 
    ); 

这样,您就可以使用“门户”路线值来选择门户网站,以及不符合将被路由到指定的控制器/行动的任何请求您默认路由,它可以负责适当地重定向用户。