Пользовательский RoleProvider в приложении MultiTenant MVC

Мне нужно разработать собственный RoleProvider для многопользовательского веб-приложения. На уровне БД у нас есть таблица, которая связывает пользователей с ролями с арендаторами.

введите описание изображения здесь

Моя проблема в том, что RoleProvider получает роли пользователей, просто передавая User as параметр, и нам нужно принимать во внимание Tenant.

В реализации RoleProvider у нас есть:

public override string[] GetRolesForUser(string username)
{
    //Code to retrieve roles from repo
}

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

public override string[] GetRolesForUser(string username, int tenantId)
{
    //Code to retrieve roles from repo
}

Текущий клиент хранится в классе ControllerBase (тот, от которого унаследованы все контроллеры).

Поставщики членства и ролей находятся в отдельном проекте, поэтому я не вижу способа использовать текущий клиент. Думаю, я мог бы создать свой собственный RoleProvider в проекте веб-приложения.

Есть идеи, как реализовать интерфейс RoleProvider, принимающий клиента как часть ввода?


person Romias    schedule 31.10.2012    source источник
comment
Клиент - это Организация, поэтому для каждой Организации у пользователя есть определенный набор ролей.   -  person Romias    schedule 31.10.2012
comment
в основном вам нужен шаблон декоратора. если другой проект не позволяет это сделать, вам нужно обернуть это в другой ваш класс.   -  person DarthVader    schedule 31.10.2012
comment
@DarthVader, я действительно не понимаю, что вы говорите, я знаю шаблон декоратора, но поскольку RoleProvider вызывается ASP.NET MVC, я не вижу, как его расширить. Не могли бы вы углубить свой ответ?   -  person Romias    schedule 31.10.2012
comment
Вы вроде как в засаде. Вы не сможете обойти GetRolesForUser и добавить дополнительный параметр, потому что восходящий поток цепочки вызовов не будет знать, как использовать ваш новый метод. Я полагаю, вы могли бы создать свой собственный RoleProvider и изменить функцию инициализации, как предлагается здесь stackoverflow.com/questions/1551503/ и используйте инъекцию зависимостей, чтобы ввести информацию о тенненанте.   -  person Nick Bork    schedule 31.10.2012


Ответы (1)


Ну, просто чтобы сообщить вам, что я сделал в моем случае:

Поскольку наши маршруты имеют форму http://[tenantName].[domain]/[App]/[Area], мы в конечном итоге получили [tenantName] из запроса, поскольку он уникален, и с помощью арендатора и UserName, которые пришли в качестве параметра, я могу сделать свой выбор в нашей таблице UsersInTenants'.

То же самое можно сделать, используя файлы cookie как способ передачи дополнительной информации.

Таким образом, вы можете получить доступ к запросу с помощью файлов cookie, но для того, что я исследую, в большинстве случаев сеанс еще не инициализирован.

Надеюсь, поможет!

person Romias    schedule 01.11.2012