Asp.net mvc ASP.NET MVC按子域授权

Asp.net mvc ASP.NET MVC按子域授权,asp.net-mvc,security,asp.net-membership,Asp.net Mvc,Security,Asp.net Membership,我有一个SaaS应用程序的常见问题,但在这里的任何地方都没有看到这个问题 我正在使用ASP.NET MVC和表单身份验证。我已经实现了一个自定义成员资格提供程序来处理逻辑,但是有一个问题(也许这个问题在我对系统的想象中) 与许多SaaS应用程序一样,客户创建帐户和使用应用程序的方式似乎只有他们在场(他们只看到他们的项目、用户等)。实际上,有一些通用控制器和视图根据URL中表示的客户呈现数据。当调用MembershipProvider.ValidateUser之类的东西时,我可以访问用户对象中的用

我有一个SaaS应用程序的常见问题,但在这里的任何地方都没有看到这个问题

我正在使用ASP.NET MVC和表单身份验证。我已经实现了一个自定义成员资格提供程序来处理逻辑,但是有一个问题(也许这个问题在我对系统的想象中)

与许多SaaS应用程序一样,客户创建帐户和使用应用程序的方式似乎只有他们在场(他们只看到他们的项目、用户等)。实际上,有一些通用控制器和视图根据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


我应该如何解决此问题?

因为授权与请求位于同一线程上,您可以通过检查来确定子域:

System.Web.HttpContext.Current.Request.Url.DnsSafeHost

在每次通话中这样做肯定会使事情井然有序,但这纯粹是授权期间的表面检查。我建议您只需在身份验证期间查看此信息。一旦您知道他们正在请求XYZ并对其进行身份验证,授权应该只关注控制他们作为XYZ访问的功能/数据。从那时起,他们来自XYZ应该作为CurrentUser的一部分存储。

这是否意味着ABC用户可以通过ABC身份验证,然后在浏览器中粘贴XYZ URL并继续,或者是否有其他机制阻止他们?否。请记住,域本身就是解析为数字的名称。它是IP地址的抽象。在对用户进行身份验证时,您只关心子域xyz。一旦您知道用户Bob访问了xyz.domain.com,您就可以针对xyz尝试他的密码。如果他进行身份验证,则您将其用户上下文存储为指向XYZ公司。接下来,他是否将子域更改为abc并不重要,因为您知道他是XYZ的Bob。他可以将其更改为任何内容,但从那时起,您已将其验证为Bob/XYZ。子域,除非您在不同的子域上加载不同的应用程序,否则只是同一IP地址的抽象。我假设你有一个web应用程序,它解析出子域作为身份验证的一部分?最后,你可以在每个请求上检查子域,但这是毫无意义的,因为无论你将他表示为Bob@XYZ.Fan-correct-one-app,我只是使用子域在路由中解析,作为控制器的附加参数。无论是子域的文本还是与之对应的CustomerID,我仍然希望根据用户的请求测试用户。我想这可以在模型逻辑中通过在每次数据请求时加入用户来实现。当用户转到xyz…时,您想要什么行为?重定向到正确的站点?拒绝访问页面?还有别的吗?在这种情况下,“12”不是xyz站点上某个人的唯一ID,因此在加载项目12时,您会拒绝他们访问吗?听起来你想单独检查用户是否在正确的域上,对吗?我还没有考虑如果他尝试了该怎么办。我只知道我想在一个高层次上抓住一个客户的用户从另一个客户那里获取数据。现在,我的逻辑仅仅是测试他是否可以在一般情况下执行操作,而不是测试他是否可以为该客户帐户执行操作(至少在[授权]代码中)。