我有一个 SaaS 应用程序的常见问题,但在这里任何地方都没有看到这个问题。
我将 ASP.NET MVC 与表单例份验证一起使用。我已经实现了一个自定义成员资格提供程序来处理逻辑,但有一个问题(也许问题出在我对系统的心理想象中)。
与许多 SaaS 应用程序一样,客户创建帐户并使用应用程序的方式看起来就像他们是唯一在场的人(他们只能看到他们的项目、用户等)。实际上,有通用 Controller 和 View 根据 URL 中表示的客户来呈现数据。当调用 MembershipProvider.ValidateUser 之类的东西时,我可以访问用户对象中用户的客户从属关系 - 我没有的是请求的上下文来比较它是否是与用户相同的客户的数据请求。
举个例子,
一家名为 ABC 的公司访问了 abc.mysite.com
另一家名为 XYZ 的公司访问 xyz.mysite.com
当 ABC 用户调用
http://abc.mysite.com/product/edit/12
我在 ProductController 的 Edit 方法上有一个 [Authorize] 属性,以确保他已登录并有足够的权限这样做。
如果同一个 ABC 用户试图访问
http://xyz.mysite.com/product/edit/12
我不想在那个电话的上下文中验证他。在 MembershipProvider 的 ValidateUser 中,我有关于用户的信息,但没有关于请求的信息。我可以判断该用户来自 ABC,但我无法判断在代码中的那个点请求是针对 XYZ 的。
我应该如何解决这个问题?
最佳答案
因为 Authorize 与请求在同一线程上,所以您可以通过检查来确定子域:
System.Web.HttpContext.Current.Request.Url.DnsSafeHost
在每次调用时都这样做肯定会使事情井然有序,但这只是授权期间的纯粹外观检查。我建议您在身份验证期间简单地查看此信息。一旦您知道他们正在请求 XYZ 并对其进行身份验证,授权就应该只关心控制他们作为 XYZ 访问的功能/数据。从那时起,它们来自 XYZ 应该存储为 CurrentUser 的一部分。
关于asp.net-mvc - ASP.NET MVC 子域授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2404610/