ASP.NET Core Identity - UserClaims, UserRoles и RoleClaims - PullRequest
0 голосов
/ 15 ноября 2018

Я настраиваю приложение, используя ASP.NET Core Identity, и, несмотря на тщательное прочтение этой темы, я изо всех сил пытаюсь найти подходящее соответствие моим требованиям.

Пользователи, знакомые с концепцией subredditReddit может хорошо понять мое требование, так как понятия очень похожи.

По сути, у меня есть требование, когда пользователь может быть модератором одной "области" (аналогично subreddit) и просто быть "Пользователь "в другой" области ".

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

Я борюсь с тем, что этона самом деле означает в терминах ASP.NET Core Identity AspNetUserClaims и AspNetRoles / AspNetUserRoles.

Я рассматриваю определение AspNetRoles следующим образом:

Id     Name
1000   User
2000   Junior Moderator
3000   Senior Moderator

Затем настройка AspNetUserClaims выглядит так:

Id     UserId     ClaimType      ClaimValue
1      1          area:public1   1000
2      1          area:private1  2000

Это будет означать, что пользователь с идентификатором 1 является «пользователем» в области «public1» и младшим модератором в области «private1».

У меня есть номерпроблемы с этим.

Во-первых, это нарушает первую нормальную форму, пытаясь вставить два значения в "ClaimType".

Во-вторых, ссылочная целостность отсутствует.

Если присмотреться к AspNetUserRoles, я вижу взаимосвязь между многими пользователями и ролями.Я не понимаю, как это будет работать, если я не определю каждую возможную роль для каждой возможной области как AspNetRole.Даже в этом случае до сих пор неясно, как бы я связал это с AspNetUserClaims безопасным способом.

Чтобы усложнить ситуацию, неясно, нужны ли мне только утверждения или комбинация утверждений и ролей.Следующий вопрос затрагивает эту тему, но я не вижу четкого пути, основанного на моих требованиях:

Рекомендации по ролям и утверждениям в ASP.NET Identity

Нет причины, по которой я не могу решить проблемы, с которыми сталкиваюсь, путем реализации решения, подобного приведенному выше, с утверждениями типа «area: public1», но это противоречит всему, что я понимаю в проектировании систем.

Учитываятребования, описанные выше, какова будет рекомендуемая реализация в ASP.NET Core Identity?

1 Ответ

0 голосов
/ 16 ноября 2018

Это будет означать, что пользователь с идентификатором 1 является «пользователем» области "public1" и младший модератор области "private1".

Если вы хотите, чтобы пользователь с идентификатором 1 имел роль User, а роль User имеет утверждения public1 типа area.

Вы можете попробовать код ниже, чтобы настроить данные.

    public class HomeController : Controller
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly RoleManager<IdentityRole> _roleManager;
    public HomeController(UserManager<IdentityUser> userManager
        , RoleManager<IdentityRole> roleManager)
    {
        _userManager = userManager;
        _roleManager = roleManager;
    }
    public async Task<IActionResult> Prepare()
    {            
        var userRole = await _roleManager.CreateAsync(new IdentityRole("User"));
        var role = await _roleManager.FindByNameAsync("User");
        var roleClaims = await _roleManager.AddClaimAsync(role, new Claim("area", "public1"));
        var user = await _userManager.FindByNameAsync("UserName");

        var roleToUser = await _userManager.AddToRoleAsync(user, "User");
        return Ok("ok");
    }

Затем получите претензии для пользователя по

    public async Task<IActionResult> Index()
    {
        var user = await _userManager.FindByNameAsync("UserName");
        var roles = await _userManager.GetRolesAsync(user);

        var roleClaims = new List<Claim>();
        foreach (var roleName in roles)
        {
            var role = await _roleManager.FindByNameAsync(roleName);
            var claims = await _roleManager.GetClaimsAsync(role);
            roleClaims.AddRange(claims);
        }

        return View();
    }

Для приведенного выше кода вам необходимо настроить .AddRoles<IdentityRole>()

        services.AddDefaultIdentity<IdentityUser>()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
...