Как добавить пользователя в роль с помощью asp. net основных служб Identity Framework в многопользовательской архитектуре - PullRequest
0 голосов
/ 06 января 2020

Мы реализуем мультитенантную архитектуру для нашего проекта.

  1. Я создал пользователя с помощью userManager.CreateAsyn c (user, register.Password);
  2. Затем создан Использование роли администратора с помощью await roleAdmin);

, поскольку наше приложение предназначено для нескольких арендаторов и имеет роль администратора для клиентов в таблице AspNetRoles, поэтому «AddToRoleAsyn c ()» не выполняется, поскольку он не получает правильную роль администратора или имеет неоднозначные » Администратор "роль в таблице AspNetRoles, поэтому выбрасывает ниже исключения. так может кто-нибудь направить меня, пожалуйста, как добавить правильную роль для конкретного пользователя. Поскольку в платформе идентификации нет службы для назначения роли пользователю, использующему «RoleID», это было бы проще. Может кто-нибудь дать решение для этого подхода или может предложить правильный подход для добавления пользователя в роли.

Как добавить пользователя в роль с помощью asp. net базовых сервисов Identity Framework В многопользовательской архитектуре. Я не могу добавить пользователя к роли администратора тенантно, используя userManager.AddToRoleAsync(),

Получение ниже исключения при выполнении userManager.AddToRoleAsync(User,Role) method

"System.InvalidOperationException: перечислителю не удалось выполнить MoveNextAsyn c. в Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync [TSource] (IAsyncEnumerable`1 asyncEnumerable, CancellationToken CancellationToken) в Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync [TSource] (IAsyncEnumerable`1 asyncEnumerable, CancellationToken CancellationToken) в Microsoft. AspNetCore. .AccountController.SignUp (регистр RegisterViewModel) в C: \ Users \ Controllers \ AccountController.cs: строка 78 "

1 Ответ

1 голос
/ 09 января 2020

Способ сделать это - переписать RoleStore по умолчанию и отфильтровать роли по арендатору в пользовательском RoleStore.

Для этого решения я предполагаю, что вы используете SaasKit для разрешения своих арендаторов, а пользовательский IdentityRole имеет свойство Tenant.

Если вы посмотрите на исходный код UserManager.AddToRoleAsyn c, они просто используют предоставленный RoleStore.

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

Итак, пользовательский RoleStore:

public class TenantRoleStore : RoleStore<ApplicationRole<string>>
{
    private readonly TenantContext<Tenant> _tenantContext;

    public TenantRoleStore(
        CustomDbContext context,
        TenantContext<Tenant> tenantContext,
        IdentityErrorDescriber describer = null)
        : base(context, describer)
    {
        _tenantContext = tenantContext;
    }

    public override IQueryable<ApplicationRole<string>> Roles => base.Roles.Where(r => r.Tenant.Id == _tenantContext.Tenant.Id);
}

В запуске просто добавьте его, где вы настраиваете Identity :

services.AddIdentity()
    .AddRoleStore<TenantRoleStore>(); // <- add this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...