在asp.net身份中创建具有多个角色的用户

时间:2017-03-09 13:11:57

标签: c# asp.net-mvc asp.net-identity role

我正在尝试创建具有多个角色的用户这是我的新用户的viewModel

 public class UserForNewViewModel
    {
        public RegisterViewModel User { get; set; }
        public List<IdentityRole> Roles { get; set; }
    }

这是我的行动

 [HttpGet]
    public async Task<ActionResult> Create()
    {
        var roles = await _context.Roles.ToListAsync();
        var model = new UserForNewViewModel()
        {
            Roles = roles
        };
        return View(model);
    }

在视图中我如何处理多角色

<div class="form-group">
            <label>Roles</label>
            ???????????????????????????????????
            @Html.DropDownListFor(x => x.Roles., new SelectList(Model.Roles, "Id", "Name"), ("Seçin..."), new { @class = "form-control", id = "ParentId" })
        </div>

enter image description here

2 个答案:

答案 0 :(得分:2)

我需要在用户创建阶段为特定用户添加多个用户角色。

所以我将使用前端的复选框来实现这一目标

所以这个视图

@model project_name.Models.RegisterViewModel

@{

}

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal"}))
{

        <div class="form-group">
            <label class="col-md-2 control-label">
                Select User Role
            </label>
            <div class="col-md-10">
                @foreach (var item in (SelectList)ViewBag.RoleId)
                {
                    <input type="checkbox" name="SelectedRoles"
                           value="@item.Value" class="checkbox-inline" />
                    @Html.Label(item.Value, new { @class = "control-label" })
                }
            </div>
        </div>

            ....

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" class="btn btn-default" value="Register" />
                </div>
            </div>
}

这些是我对AspNet Identity 2.0 framework folder =&gt;中现有App_Start所做的更改IdentityConfig.cs档案

    public class RoleManager<TRole> : RoleManager<TRole, string> where TRole : class, IRole<string>
    {
        //
        // Summary:
        //     Constructor
        //
        // Parameters:
        //   store:
        public RoleManager(IRoleStore<TRole, string> store);
    }

       public class ApplicationRoleManager : RoleManager<ApplicationRole>
        {
            public ApplicationRoleManager(
                IRoleStore<ApplicationRole, string> roleStore)
                : base(roleStore)
            {
            }
            public static ApplicationRoleManager Create(
                IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
            {
                return new ApplicationRoleManager(
                    new RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));
            }
     }

这些是我对AspNet Identity 2.0 framework folder =&gt;中现有Models所做的更改IdentityModels.cs档案

    public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
        UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(
            this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }
}

   public class ApplicationRole : IdentityRole
    {
        public ApplicationRole() : base() { }
        public ApplicationRole(string name) : base(name) { }
        public string Description { get; set; }
    }

然后我按如下方式设置了控制器的寄存器方法

   // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model, HttpPostedFileBase upload, params string[] selectedRoles)
    {

        try
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };                      


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

                if (result.Succeeded)
                {
                    //Add User to the selected Roles 
                    if (selectedRoles != null)
                    {
                        var addroles = await UserManager.AddToRolesAsync(user.Id, selectedRoles);
                        if (!addroles.Succeeded)
                        {
                            ModelState.AddModelError("", result.Errors.First());
                            ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync("Name", "Name"));
                            return View();
                        }
                    }

                }

                else
                {
                    ModelState.AddModelError("", result.Errors.First());
                    ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
                    return View();
                }

                return RedirectToAction("Index");
                // AddErrors(result);
            }

        }

        // If we got this far, something failed, redisplay form
        catch (RetryLimitExceededException /* dex */)
        {
            //Log the error (uncomment dex variable name and add a line here to write a log.
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
        }

        ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");

        return View(model);
    }

但是存在'RoleManager'字的上述控制器的每一行我都得到编译时错误,如下所示

  

使用泛型类型'RoleManager TRole,TKey'需要2种类型   参数

这意味着我在上面的方法中遇到了3个编译时错误。

我也跟着this reference想法为aspnet idenity中的用户分配多个角色

修改

我刚刚更改了IdentityRole.cs[MetaData]IdentityUserRole[MetaData],如下所示

namespace Microsoft.AspNet.Identity.EntityFramework
{
    //
    // Summary:
    //     Represents a Role entity

    public class IdentityRole : IdentityRole<string, IdentityUserRole>
    {
        //
        // Summary:
        //     Constructor
        public IdentityRole();
        //
        // Summary:
        //     Constructor
        //
        // Parameters:
        //   roleName:
        public IdentityRole(string roleName);
    }   

public class IdentityRole<TKey, TUserRole> : IRole<TKey>
where TUserRole : IdentityUserRole<TKey>
{
    public TKey Id
    {
        get
        {
            return JustDecompileGenerated_get_Id();
        }
        set
        {
            JustDecompileGenerated_set_Id(value);
        }
    }
    public string Name
    {
        get;
        set;
    }
    public ICollection<TUserRole> Users
    {
        get
        {
            return JustDecompileGenerated_get_Users();
        }
        set
        {
            JustDecompileGenerated_set_Users(value);
        }
    }
    public IdentityRole()
    {
        this.Users = new List<TUserRole>();
    }
}

public class IdentityUserRole<TKey>
{
    public virtual TKey RoleId
    {
        get;
        set;
    }
    public virtual TKey UserId
    {
        get;
        set;
    }
    public IdentityUserRole()
    {
    }
}
}

答案 1 :(得分:0)

您可以使用复选框来执行此操作,例如

 <div class="col-md-10">
            @foreach (var item in (SelectList)ViewBag.RoleId)
            {
                <input type="checkbox" name="SelectedRoles"
                       value="@item.Value" class="checkbox-inline" />
                @Html.Label(item.Value, new { @class = "control-label" })
            }
        </div>