Добавление пользователя в роль Идентификация ASP.NET

Я знаю, что новое членство включает в себя "Простой поставщик роли".

Я не могу найти помощь, связанную с созданием пользователя и назначением роли при создании пользователя. Я добавил пользователя, который правильно создал таблицы в БД. Я вижу AspNetRoles, AspNetUserRoles и AspNetUsers.

Я хочу назначить роль из AspNetRoles для пользователя в AspNetUsers который идентификатор роли/пользователя должен быть сохранен в AspNetUserRoles.

Я застрял в части программирования, где и как это сделать, когда я создаю пользователя.

У меня есть раскрывающийся список, чтобы выбрать роль, но используя Entity CF вместе с новой моделью ASP.NET Identity, я не уверен, как взять идентификатор выбранного значения из раскрывающегося списка и UserID и назначить роль.

Ответ 1

Я нашел хороший ответ здесь Динамическое добавление роли в новый пользовательский диспетчер задач VS 2013

Но в случае, чтобы предоставить пример, чтобы вы могли его проверить, я собираюсь поделиться некоторым кодом по умолчанию.

Сначала убедитесь, что вы вставили Роли.

enter image description here

И второй тест на метод регистра пользователя.

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser() { UserName = model.UserName  };

        var result = await UserManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            var currentUser = UserManager.FindByName(user.UserName); 

            var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers");

            await SignInAsync(user, isPersistent: false);
            return RedirectToAction("Index", "Home");
        }
        else
        {
            AddErrors(result);
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

И, наконец, вы должны получить "суперпользователей" из раскрывающегося списка ролей.

Ответ 2

У меня был такой же вызов. Это решение, которое я нашел для добавления пользователей в роли.

internal class Security
{
    ApplicationDbContext context = new ApplicationDbContext();

    internal void AddUserToRole(string userName, string roleName)
    {
        var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));

        try
        {
            var user = UserManager.FindByName(userName);
            UserManager.AddToRole(user.Id, roleName);
            context.SaveChanges();
        }
        catch
        {
            throw;
        }
    }
}

Ответ 3

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

Начиная с.NET Framework 4.5, Windows Identity Foundation (WIF) полностью интегрирован в.NET Framework.

В приложениях, поддерживающих заявки, роль выражается типом заявки на роль, который должен быть доступен в токене. Когда вызывается метод IsInRole(), выполняется проверка, чтобы проверить, имеет ли текущий пользователь эту роль.

Тип заявки на роль выражается с использованием следующего URI: " http://schemas.microsoft.com/ws/2008/06/identity/claims/role "

Поэтому вместо использования RoleManager вы можете "добавить пользователя в роль" из UserManager, делая что-то вроде этого:

var um = new UserManager();
um.AddClaimAsync(1, new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "administrator"));

С приведенными выше строками вы добавили заявку на роль со значением "administrator" для пользователя с идентификатором "1"...

Утверждение претензий, предложенное MSFT, может упростить и увеличить производительность процессов аутентификации и авторизации, исключая некоторые внутренние запросы каждый раз, когда авторизация имеет место.

Используя претензии, вам больше не понадобится RoleStore. (AspNetRoles, AspNetUserRoles)

Ответ 4

Вы ищете что-то вроде этого:

RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var str = RoleManager.Create(new IdentityRole(roleName));

Также проверьте идентификатор пользователя

Ответ 5

Проверьте эту ссылку: Назначение роли пользователям. Вы можете добавить шаг к элементу управления CreateUserWIzard и выбрать роли на этом шаге.

<asp:CreateUserWizard ID="RegisterUserWithRoles" runat="server" 
    ContinueDestinationPageUrl="~/Default.aspx" LoginCreatedUser="False" 
    onactivestepchanged="RegisterUserWithRoles_ActiveStepChanged">
    <WizardSteps>
        <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
        </asp:CreateUserWizardStep>
        <asp:WizardStep ID="SpecifyRolesStep" runat="server" AllowReturn="False" 
            StepType="Step" Title="Specify Roles">
            <h3>Choose the role.</h3>
            <asp:CheckBoxList ID="RoleList" runat="server">
            </asp:CheckBoxList>
        </asp:WizardStep>
        <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
        </asp:CompleteWizardStep>
    </WizardSteps>
</asp:CreateUserWizard>

И в коде, который у вас будет:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // Reference the SpecifyRolesStep WizardStep 
        WizardStep SpecifyRolesStep = RegisterUserWithRoles.FindControl("SpecifyRolesStep") as WizardStep;

        // Reference the RoleList CheckBoxList 
        CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList;

        // Bind the set of roles to RoleList 
        RoleList.DataSource = Roles.GetAllRoles();
        RoleList.DataBind();
    } 
}
protected void RegisterUserWithRoles_ActiveStepChanged(object sender, EventArgs e)
{
    // Have we JUST reached the Complete step? 
    if (RegisterUserWithRoles.ActiveStep.Title == "Complete")
    {
        // Reference the SpecifyRolesStep WizardStep 
        WizardStep SpecifyRolesStep = RegisterUserWithRoles.FindControl("SpecifyRolesStep") as WizardStep;

        // Reference the RoleList CheckBoxList 
        CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList;

        // Add the checked roles to the just-added user 
        foreach (ListItem li in RoleList.Items)
        {
            if (li.Selected)
                Roles.AddUserToRole(RegisterUserWithRoles.UserName, li.Text);
        }
    }
}

Ответ 6

Ниже приведена альтернативная реализация метода контроллера "создать пользователя" с использованием ролей, основанных на требованиях.

Созданные заявки затем работают с атрибутом Authorize, например [Authorize (Roles = "Admin, User. *, User.Create")]

    // POST api/User/Create
    [Route("Create")]
    public async Task<IHttpActionResult> Create([FromBody]CreateUserModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        // Generate long password for the user
        var password = System.Web.Security.Membership.GeneratePassword(25, 5);

        // Create the user
        var user = new ApiUser() { UserName = model.UserName };
        var result = await UserManager.CreateAsync(user, password);
        if (!result.Succeeded)
        {
            return GetErrorResult(result);
        }

        // Add roles (permissions) for the user
        foreach (var perm in model.Permissions)
        {
            await UserManager.AddClaimAsync(user.Id, new Claim(ClaimTypes.Role, perm));
        }

        return Ok<object>(new { UserName = user.UserName, Password = password });
    }

Ответ 7

Этот работает для меня. Вы можете увидеть этот код на AccountController → Регистрация

var user = new JobUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
    //add this to add role to user
     await UserManager.AddToRoleAsync(user.Id, "Name of your role");
}

но имя роли должно существовать в вашей таблице AspNetRoles.