Добавление пользователя в роль Идентификация 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.