Owin утверждает - добавьте несколько ClaimTypes.Role

У меня есть приложение, в котором пользователям могут быть назначены следующие роли:

  • SuperAdmin
  • Администратор
  • Пользователь

Один пользователь может назначить две или более роли, например. как SuperAdmin, так и User. Мое приложение использует претензии, и поэтому я хочу также аутентифицировать роли пользователей через претензии. например:

[Authorize(Roles="Admin")]

К сожалению, я не знаю, как добавить несколько ролей в свой ClaimTypes.Role. У меня есть следующий код:

var identity = new ClaimsIdentity(new[] {
                new Claim(ClaimTypes.Name, name),
                new Claim(ClaimTypes.Email, email),
                new Claim(ClaimTypes.Role, "User", "Admin", "SuperAdmin")
        },
            "ApplicationCookie");

Как вы можете видеть, я попытался добавить больше ролей для иллюстрации, но, очевидно, это сделано неправильно, и поэтому не работает. Поэтому всякая помощь очень ценится.

Ответ 1

Идентификатор претензий может иметь несколько претензий с одним и тем же типом ClaimType. Это позволит использовать метод HasClaim для проверки наличия конкретной роли пользователя.

var identity = new ClaimsIdentity(new[] {
            new Claim(ClaimTypes.Name, name),
            new Claim(ClaimTypes.Email, email),
            new Claim(ClaimTypes.Role, "User"),
            new Claim(ClaimTypes.Role, "Admin"), 
            new Claim(ClaimTypes.Role,"SuperAdmin")
    },
        "ApplicationCookie");

Ответ 2

@Parameswar Рао объяснил хорошо, но в случае динамических ролей

Например, пользовательский объект уже имеет роль свойства типа list, например

enter image description here

затем с помощью локальных функций

  ClaimsIdentity getClaimsIdentity()
                {
                    return new ClaimsIdentity(
                        getClaims()
                        );

                   Claim[] getClaims()
                    {
                        List<Claim> claims = new List<Claim>();
                        claims.Add(new Claim(ClaimTypes.Name, user.UserName));
                        foreach (var item in user.Roles)
                        {
                            claims.Add(new Claim(ClaimTypes.Role, item));
                        }
                        return claims.ToArray();
                    }

                }
                    var tokenDescriptor = new SecurityTokenDescriptor
                    {


                        Subject = getClaimsIdentity()
                    }