User.IsInRole () возвращает false и Авторизация ролей дает мне доступ запрещен - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь настроить аутентификацию в моем существующем приложении с ASP.NET Core Identity 2.0. Поскольку я использую свою собственную схему базы данных и классы, у меня есть свои собственные классы User и Role, и мне пришлось создавать собственные UserStore / UserManager / RoleStore / RoleManager.

Я заявляю их в моих услугах:

services.AddIdentity<User, Profile().AddUserManager<CustomUserManager<User>>().AddRoleManager<CustomRoleManager>().AddDefaultTokenProviders();
services.AddTransient<IUserStore<User>, UserStore>();
services.AddTransient<IRoleStore<Profile>, ProfileStore>();
services.AddTransient<UserResolverService>();

Я реализую интерфейс UserRoleStore в UserStore с помощью следующих методов:

    public Task AddToRoleAsync(User user, string roleName, CancellationToken cancellationToken)
    {
        user.Profiles.Add(db.Profiles.ToList().Find(x => x.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase)));

        db.SaveChanges();

        return Task.FromResult((object)null);
    }

    public Task RemoveFromRoleAsync(User user, string roleName, CancellationToken cancellationToken)
    {
        user.Profiles.Remove(db.Profiles.ToList().Find(x => x.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase)));

        db.SaveChanges();

        return Task.FromResult((object)null);
    }

    public Task<IList<string>> GetRolesAsync(User user, CancellationToken cancellationToken)
    {
        IList<string> ret = new List<string>();
        user.Profiles.ToList().ForEach(x => ret.Add(x.Name));
        return Task.FromResult(ret);
    }

    public Task<bool> IsInRoleAsync(Useruser, string roleName, CancellationToken cancellationToken)
    {
        Profile searchRole = db.Profiles.Include(profile => profile.ProfileUsers).ToList().Find(x => x.Active && x.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase));
        return Task.FromResult(searchRole.ProfileUsers.ToList().Find(x => x.UserID == user.ID) == null ? false : true);
    }

    public Task<bool> IsInRole(User user, string roleName, CancellationToken cancellationToken)
    {
        return Task.FromResult(true);
    }

    public Task<IList<Utilisateur>> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken)
    {
        Profile currentProfile = db.Profiles.Include(profile => profile.ProfileUsers).ThenInclude(pu => pu.User).ToList().Find(x => x.Active && x.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase));
        if (currentProfile == null)
        {
            return Task.FromResult((IList<User>)null);
        }

        IList<User> ret = new List<User>();
        currentProfile.ProfileUsers.ToList().ForEach(x => ret.Add(x.User));
        return Task.FromResult(ret);
    }

Так что, когда я пытаюсь сделать

var result1 = _userManager.AddToRoleAsync(userObject, "WorkOrderViewer");
var res = _userManager.GetUsersInRoleAsync("WorkOrderViewer");
var test = await _userManager.IsInRoleAsync(userObject, "WorkOrderViewer");

Это работает, и мой пользователь получает выбранную роль. Однако, когда я пытаюсь настроить полномочия контроллера или видимость элементов управления в представлении, это не работает. Для авторизации контроллера у меня отказано в доступе для примера.

Когда я добавляю это в мой код:

var test = User.IsInRole("WorkOrderViewer");

Он возвращает «ложь», даже если я вошел в приложение (я пытаюсь выйти из системы и войти в систему) и если UserManager.IsInRoleAsync вернул мне «true».

Я думаю, что это не сработает, потому что UserManager.AddToRoleAsync () не синхронизирован с User.IsInRole (), но я не знаю, как его решить. Вы понимаете, что я делаю не так?

1 Ответ

0 голосов
/ 03 июля 2018

Когда вы говорите, что используете код User.IsInRole Я предполагаю, что вы имеете в виду Controller.

User в контроллере имеет тип ClaimsPrincipal.

А метод ClaimsPrincipal.IsInRole имеет следующую документацию:

Метод IsInRole проверяет, содержит ли удостоверение, которым обладает этот принципал утверждений, утверждение типа ClaimsIdentity.RoleClaimType, где значение утверждения равно значению, указанному параметром роли.

Это можно подтвердить, посмотрев источник для ClaimsIdentity.cs .

if (_identities[i].HasClaim(_identities[i].RoleClaimType, role))

Итак, User.IsInRole проверяет, есть ли у пользователя претензия типа RoleClaimType (по умолчанию "http://schemas.microsoft.com/ws/2008/06/identity/claims/role.").

").

Тип заявки может быть настроен по мере необходимости.

...