ASP.NET MVC Авторизация по поддомену - PullRequest
4 голосов
/ 08 марта 2010

У меня есть то, что кажется общей проблемой с приложениями SaaS, но я нигде не видел этот вопрос.

Я использую ASP.NET MVC с проверкой подлинности с помощью форм. Я реализовал пользовательский поставщик членства для обработки логики, но у меня есть одна проблема (возможно, проблема в моем представлении о системе).

Как и во многих приложениях SaaS, клиенты создают учетные записи и используют приложение так, как будто они присутствуют только (они видят только свои товары, пользователей и т. Д.). В действительности, существуют общие контроллеры и представления, представляющие данные в зависимости от клиента, представленного в URL. Когда я вызываю что-то вроде MembershipProvider.ValidateUser, у меня есть доступ к принадлежности клиента к пользователю в объекте User - у меня нет контекста запроса, чтобы сравнить, является ли это запросом данных для того же клиента, что и пользователя.

В качестве примера

Одна компания под названием ABC переходит на abc.mysite.com

Другая компания под названием XYZ переходит на xyz.mysite.com

Когда пользователь ABC звонит

http://abc.mysite.com/product/edit/12 

У меня есть атрибут [Authorize] для метода Edit в ProductController, чтобы убедиться, что он вошел в систему и имеет достаточные разрешения для этого.

Если тот же самый пользователь ABC попытался получить доступ

http://xyz.mysite.com/product/edit/12 

Я бы не хотел проверять его в контексте этого звонка. В ValidateUser пользователя MembershipProvider у меня есть информация о пользователе, но не о запросе. Я могу сказать, что пользователь из ABC, но я не могу сказать, что запрос для XYZ в этот момент в коде.

Как мне решить эту проблему?

1 Ответ

3 голосов
/ 09 марта 2010

Поскольку Authorize находится в том же потоке, что и запрос, вы можете определить поддомен, проверив:

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

Выполнение этого при каждом вызове, безусловно, будет держать все в порядке, однако это чисто косметическая проверка во время авторизации. Я рекомендую вам просто посмотреть на эту информацию во время аутентификации. Как только вы узнаете, что они запрашивают XYZ и аутентифицируют их в нем, авторизация должна касаться только управления функциями / данными, к которым они имеют доступ как XYZ. Начиная с этой точки, их существо из XYZ должно храниться как часть CurrentUser.

...