我正在尝试实现一个与另一个站点交互的小型ASP.NET MVC站点。简而言之,会话通过URL中的令牌在主站点和卫星站点之间进行管理。我可以指定url格式,但我不能删除会话令牌作为URL的一部分提交的要求。
我正在努力研究如何设置路由,并且在这里有几个想法。我无法决定哪种方法最好,或者是否有更好的方法可以做到。我想的主要方式是:
routes.MapRoute("Main", "{controller}/{action}/{id}/{token}");
提供http://mysite.com/Products/Detail/5/5f1c8bbf-d4f3-41f5-ac5f-48f5644a6d0f之类的网址 Pro:大多数都遵循现有的MVC惯例进行网站调整 Con:在支持ID和Action的默认值时,为路由添加复杂功能。
routes.MapRoute("Main", "{token}/{controller}/{action}/{id}/");
提供http://mysite.com/5f1c8bbf-d4f3-41f5-ac5f-48f5644a6d0f/Products/Detail/5之类的网址 Pro:简化路由 - 仍然可以按照标准MVC约定应用action / id默认值 骗局:非常“非网络”的网址。在转到表中的下一个路由之前,需要正则表达式验证第一个变量是否是有效的GUID /令牌。
想到另一种可能性,通过以下会议:
http://mysite.com/Home/Index?session=5f1c8bbf-d4f3-41f5-ac5f-48f5644a6d0f
与之相关的问题是我有一个从Controller派生的基类,所有其他安全页面都经过这个基类。 SecureController类重写Execute()并检查从URL获取的令牌的有效性。两种方法(GET和路由)似乎都很容易在控制器Execute()函数中获取令牌,但GET方法感觉有点俗气,而路由方法感觉就像是,因为缺乏更好的解释,打破了MVC路由设计的优雅。
有没有其他人接受过类似的问题并且有任何特别的成功或困难要分享?
答案 0 :(得分:2)
似乎无论你做什么,你的网址都会被这个令牌弄得一团糟。
我不得不在ASP.NET MVC应用程序中处理这种单点登录功能,但我采用了一种稍微不同且更简单的方法:我创建了GatewayController
并使用{{ 1}}将会话令牌和URL作为参数的操作。
然后,此SignOn
操作只检查会话令牌的有效性,然后将用户签名到我的站点,重定向到提供的URL。从那时起,不再需要会话令牌,因为从那时起的身份验证将基于cookie。
根据您的要求,它可能不完全适用于您的情况。如果您需要在某处不断检查会话令牌的有效性,那么您可以像我一样做同样的事情,然后将会话令牌存储在用户的会话数据中,允许您检查每个请求中的令牌。