富士重工,
我需要构建一个具有某些门户功能的网站,其中请求中的参数将识别门户网站。喜欢http:/ domain / controller / action / portal
现在我的问题是,如果门户网站不存在,必须有重定向到其他网站/页面,用户可以登录到一个门户网站,但如果用户访问其他门户网站,则必须将用户重定向回该门户网站的登录页面。
我现在有一些工作,但我觉得必须有一个中心位置来处理这个问题。我当前的解决方案使用自定义操作筛选器来检查门户网站参数并查看门户网站是否存在并检查用户是否在该门户网站中登录(用户登录的门户网站位于身份验证cookie中)。我在application_postauthentication事件中创建了自己的IIndentiy和IPrincipal。
我目前的做法有两个问题:
1:它没有真正实施,我必须将属性添加到所有控制器和/或操作。
2:用户上的isauthenticated并没有真正起作用,我希望能够正常工作。但是,为此,当我创建我的IPrincipal / IIndenty时,我需要访问路径的参数,而我似乎无法找到正确的位置。
希望有人可以给我一些指示, 理查德。
答案 0 :(得分:1)
有几种不同的方法可以做到这一点(一如既往......)。如果你想在控制器中(或通过属性)这样做,但你也想在全局范围内完成它,那么你总是可以使用自定义基本控制器类并在那里应用逻辑。 actionfilterattribute是继承的,bob是你的叔叔。
另一方面,这个真的对我来说感觉像是路由问题。所以我可能会考虑创建一个自定义路由来处理你正在做的事情。如果你这样做,那么一旦你开始工作,你就会想要在负载下测试它,以确保你有一个好的缓存策略(这样每个请求都不是路由的数据库查找+另一个对于控制器中发生的任何事情)。
答案 1 :(得分:0)
您可以通过控制器中的属性强制执行用户授权。您可以将此应用于每个操作(获取和发布)。我认为为控制器内的每个动作添加某种验证以编写安全代码是合理的,如果我在这里错了,请纠正我。
答案 2 :(得分: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"}
);
通过这种方式,您可以使用“门户”路由值来选择门户网站,任何不匹配的请求都将路由到默认路由中指定的控制器/操作,这可以适当地重定向用户。