Подтвердить что ты не робот

Как создавать роли и добавлять пользователей в роли в ASP.NET MVC Web API

У меня есть проект .NET Web API, который использует отдельные учетные записи пользователей. Я могу хорошо зарегистрировать пользователей, используя стандартный шаблон AccountController. Однако теперь я хочу настроить роли и добавить пользователей в роли в зависимости от типа пользователя.

В базе данных автоматически не создаются роли. Как настроить роли и как добавить пользователей в роли?

Единственная информация, которую я могу найти на ней, основана на старом членстве ASP.NET, поэтому она не работает из-за того, что хранимые процедуры не настроены для нее.

Просматривали форумы и учебные пособия в MSDN и не могли найти пример для веб-API.

4b9b3361

Ответ 1

Вы можете добавлять роли с помощью RoleManager...

using (var context = new ApplicationDbContext())
{
    var roleStore = new RoleStore<IdentityRole>(context);
    var roleManager = new RoleManager<IdentityRole>(roleStore);

    await roleManager.CreateAsync(new IdentityRole { Name = "Administrator" });

    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);

    var user = new ApplicationUser { UserName = "admin" };
    await userManager.CreateAsync(user);
    await userManager.AddToRoleAsync(user.Id, "Administrator");
}

Вы правы, что документация сейчас немного светлая. Но я обнаружил, что, как только вы немного поработали с RoleManager и UserManager, API довольно легко обнаружить (но, возможно, не всегда интуитивно понятный, а иногда вам приходится запускать запросы непосредственно против хранилища или даже контекста db).

Ответ 2

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

В последнем WebAPI2 (Update Studio 2013 Update 2) метод регистрации будет выглядеть так:

// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

    IdentityResult result = await UserManager.CreateAsync(user, model.Password);


    if (!result.Succeeded)
    {
        return GetErrorResult(result);
    }

    return Ok();
}

Что вы хотите сделать, замените его следующим:

// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }


    IdentityResult result;
    using (var context = new ApplicationDbContext())
    {
        var roleStore = new RoleStore<IdentityRole>(context);
        var roleManager = new RoleManager<IdentityRole>(roleStore);

        await roleManager.CreateAsync(new IdentityRole() { Name = "Admin" });

        var userStore = new UserStore<ApplicationUser>(context);
        var userManager = new UserManager<ApplicationUser>(userStore);

        var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

        result = await UserManager.CreateAsync(user, model.Password);
        await userManager.AddToRoleAsync(user.Id, "Admin");

    }

    if (!result.Succeeded)
    {
        return GetErrorResult(result);
    }

    return Ok();
}

Теперь, когда вы публикуете сообщение, он должен работать правильно, но вы можете столкнуться с еще одной проблемой. После того, как я это сделал, мой ответ пожаловался на БД.

The model backing the <Database> context has changed since the database was created

Чтобы исправить эту ошибку, мне пришлось зайти в консоль диспетчера пакетов и включить Migrations.

Enable-Migrations –EnableAutomaticMigrations

Тогда:

Add Migration

Наконец:

Update-Database

Хорошая публикация о возможностях миграции здесь: http://msdn.microsoft.com/en-us/data/jj554735.aspx