Ajouter L'utilisateur au rôle ASP.NET L'identité

je sais que les nouveaux membres comprennent un" simple fournisseur de rôle."

Je ne trouve aucune aide liée à la création d'un utilisateur et à l'attribution d'un rôle lorsque l'utilisateur est créé. J'ai ajouté un utilisateur qui a créé les tables sur le DB correctement. Je vois le AspNetRoles , AspNetUserRoles , et AspNetUsers des tables.

je veux assigner un rôle de AspNetRoles à un utilisateur dans AspNetUsers que le ID des deux le rôle/l'utilisateur doivent être stockés dans AspNetUserRoles.

je suis bloqué sur la partie programmation de où et comment faire cela quand je crée l'utilisateur.

j'ai une liste déroulante pour sélectionner le rôle, mais en utilisant L'entité CF avec le nouveau ASP.NET modèle D'identité Je ne sais pas comment prendre L'ID de la valeur sélectionnée dans la liste déroulante et l'ID utilisateur et attribuer le rôle.

28
demandé sur Academy of Programmer 2013-10-30 20:58:50

6 réponses

j'ai trouvé la bonne réponse ici Ajout de Rôle de façon dynamique dans la nouvelle VS 2013 Identité UserManager

mais dans le cas de fournir un exemple pour que vous puissiez le vérifier, je vais partager du code par défaut.

assurez-vous D'abord que vous avez des rôles insérés.

enter image description here

et le deuxième test il sur la méthode de registre de l'utilisateur.

[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);
}

et enfin vous je dois trouver" Superusers " dans la liste déroulante des rôles.

57
répondu Academy of Programmer 2017-05-23 12:25:34

j'ai eu le même défi. C'est la solution que j'ai trouvée pour ajouter des utilisateurs aux rôles.

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;
        }
    }
}
21
répondu Tarzan 2014-10-09 16:44:34

bien que je sois d'accord avec les autres réponses concernant le RoleManager, je conseillerais d'examiner la possibilité de mettre en œuvre L'autorisation par le biais de revendications ( exprimant des rôles en tant que revendications ).

à partir du .net Framework 4.5, Windows Identity Foundation (WIF) a été pleinement intégré dans le .net Framework.

dans les applications tenant compte des revendications, le rôle est exprimé par un type de revendication de rôle qui devrait être disponible en jeton. Quand la méthode IsInRole () est appelée, il y a une vérification faite pour voir si l'utilisateur courant a ce rôle.

le type de revendication de rôle est exprimé en utilisant L'URI suivant:: " http://schemas.microsoft.com/ws/2008/06/identity/claims/role "

" So au lieu d'utiliser le RoleManager , vous pouvez "ajouter un utilisateur à un rôle" à partir du UserManager , faire quelque chose comme ceci:

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

Avec les lignes ci-dessus que vous avez ajouté une déclaration de rôle avec la valeur "administrateur" pour l'utilisateur avec l'id "1"...

Demandes d'autorisation, comme suggéré par MSFT, permettent de simplifier et d'améliorer les performances de l'authentification et de l'autorisation des processus de l'élimination de certains des requêtes à chaque fois que l'autorisation a lieu.

en utilisant des revendications vous n'avez peut-être plus besoin du RoleStore. (Aspnetruserroles, AspNetUserRoles)

9
répondu MyOwnWay 2014-02-03 01:35:00

cherchez-vous quelque chose comme ceci:

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

cochez Aussi l'Identité de l'Utilisateur

7
répondu Rahul Tripathi 2013-10-30 17:03:10

Check ce lien: l'Attribution de Rôles aux Utilisateurs . Vous pouvez ajouter une étape à votre contrôle CreateUserWIzard et choisir les rôles dans cette étape.

<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>

et dans le code-derrière vous aurez:

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);
        }
    }
}
1
répondu user3138901 2014-01-03 13:43:37

ci-dessous est une implémentation alternative d'une méthode de contrôleur 'create user' utilisant des rôles basés sur des revendications.

les revendications créées fonctionnent alors avec L'attribut Authorize par exemple [Authorize(Roles =" Admin, User.*, Utilisateur.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 });
    }
1
répondu cwills 2016-05-27 07:46:12