2014-09-14 4 views
5

Я создал приложение с несколькими арендаторами, использующее Entity Framework, WebAPI, ASP.NET Identity. В основном он считывает субдомен арендатора и использует его для чтения строки соединения из базы данных и устанавливает ее во время выполнения.Идентификатор ASP.NET + Token + Multi-Tenant

Все отлично, создается база данных и т. Д., Но единственная проблема теперь - токен-носитель идентификатора ASP.NET.

Когда я создал токен доступа к проводнику для http://tenant1.#####.com/token, кажется, что токен подписан в одном приложении (машинный ключ не указан), а также разрешает доступ к контроллерам http://tenant2.#####.com, что не должно быть так как это разные субдомены/арендаторы.

Есть ли способы обойти это? Или, возможно, я должен искать другую структуру безопасности, а не идентификатор ASP.NET?

+0

Вам нужно взять под контроль токены и добавить туда пользовательские данные, имя арендатора. Поскольку жетоны основаны на требованиях, это должно быть возможным. Затем выполните еще одну проверку каждого запроса, чтобы проверить, соответствует ли текущий арендатор одному из токена. Эта проверка может быть выполнена в пользовательском модуле http, например. –

+0

Здравствуйте, в этом случае использование претензий было бы «безопасным» подходом? Потому что все, что требуется, - это подделать токен с правильной претензией на тентификат и запрос может пройти? –

+0

Вы не можете подделать токен на стороне клиента. –

ответ

3

MVC5 позволяет легко добавить претензию владельца к идентификатору пользователя. В каталоге моделей, редактировать ApplicationUser класс в IdentityModels.cs:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
{ 
    // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 

    // Add claim for tenant name 
    userIdentity.AddClaim(new Claim("tenantName", "abcCompany"); 

    // Add custom user claims here 
    return userIdentity; 
} 

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

+0

Можно ли получить пример того, как приобрести имя арендатора в том месте, где вы добавляете его в качестве претензии? В настоящее время изучаем это, но также пытаемся избежать переопределения всего в SignInManager. –

+0

Я делаю что-то похожее на то, как пользователь –

+0

Это зависит от вашей реализации. Имя арендатора может быть основано на поддомене запроса, значении cookie или может быть явно предоставлено пользователем. Что касается доступа к значению, я использую тот же шаблон, который использует ASP.NET для реализации IPrincipal и IIdentity. Внутренне IPrincipal имеет ссылку на запрос для текущего пользователя. –

Смежные вопросы