【问题标题】:asp.net mvc and portal like functionalityasp.net mvc 和门户之类的功能
【发布时间】:2011-02-24 00:44:14
【问题描述】:

你好,

我需要构建一个具有类似门户功能的站点,其中请求中的参数将识别门户。就像这样 http://domain/controller/action/portal

现在我的问题是,如果门户不存在,则必须重定向到另一个站点/页面,并且用户可以登录到一个门户,但是如果用户来到另一个门户,则必须将用户重定向回该门户的登录页面。

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

我目前的方法有两个问题:

1:它并没有真正强制执行,我必须将属性添加到所有控制器和/或操作。

2:用户的身份验证并没有真正起作用,我希望它能够起作用。但为此,我需要在创建 IPrincipal/IIndenty 时访问路线的参数,但我似乎无法找到正确的位置。

希望有大神指点一下 理查德。

【问题讨论】:

    标签: asp.net-mvc model-view-controller asp.net-mvc-routing


    【解决方案1】:

    您可以通过控制器中的属性强制执行用户授权。您可以将此应用于每个操作(获取和发布)。我认为在控制器中为每个操作添加某种验证以编写安全代码是合理的,如果我在这里错了,请纠正我。

    【讨论】:

    • 这是一个选项,这就是我现在正在做的事情。但我认为这不是正确的方法,因为它实际上是一个应用程序范围的东西,而不是控制器级别的东西。换句话说,我认为应用程序必须强制执行规则,如果门户不存在重定向,甚至不必费心尝试去某个控制器。它应该更像是路线不存在,除了重定向没有去处。用户身份也是如此,如果他访问一个他没有登录的门户,那么它不应该被授权用于漏洞应用程序。
    【解决方案2】:

    有几种不同的方法可以做到这一点(一如既往......)。如果您想在控制器中(或通过属性)执行此操作,但您也想在全局范围内执行此操作,那么您始终可以使用自定义基控制器类并在那里应用逻辑。 actionfilter 属性是继承的,并且 bob 是你的叔叔。

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

    【讨论】:

      【解决方案3】:

      对于缺少的门户重定向,我会在路由中处理这个问题。如果您的门户数量相对较少,您可以通过为每个控制器创建一个唯一的路由,然后为重定向设置默认路由来做到这一点。路由按照您创建它们的顺序进行评估,因此只需将默认路由放在底部即可。您的路线注册将如下所示:

      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"}
          );
      

      这样您可以使用“portal”路由值来选择门户,任何不匹配的请求都将被路由到您的默认路由中指定的控制器/操作,该控制器/操作可以适当地重定向用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 2018-12-06
        相关资源
        最近更新 更多