注册用户时设置AspNetUserRoles

时间:2014-11-26 12:15:31

标签: c# asp.net-mvc registration account role

以下是我想要做的事情:我想在注册页面中将 AspNetUserRole 设置为新用户。

型号:

    namespace MyProject.Models
    {
        public enum AccountRole
        {
            Responder = 10003, Sender= 10002, Admin = 10001
        }

        ...

        [Required()]
        [Display(Name = "Account role")]
        public AccountRole? AccountRole { get; set; }

查看:

@Html.LabelFor(model => model.AccountRole, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EnumDropDownListFor(model => model.AccountRole, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.AccountRole, "", new { @class = "text-danger" })
        </div>

注册页面结果: http://imgur.com/1lHL06L

控制器:

    // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
            IdentityResult result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                //User accountRole to AspNetUserRoles BY JULIUS
                var accountRole = model.AccountRole;

                await SignInAsync(user, isPersistent: false);

                string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                var callbackUrl = Url.Action("ConfirmEmail", "Account",
                   new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                await UserManager.SendEmailAsync(user.Id,
                   "Confirm your account", "Please confirm your account by clicking <a href=\""
                   + callbackUrl + "\">here</a>");


                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }

请将您的注意力转移到 AccountController.cs 注册部分。 我已成功收集了从下拉列表中输入的 AccountRole枚举

var accountRole = model.AccountRole;

我想要做的是将accountRole设置为我的实体框架 DefaultConnection

中的 AspNetUserRoles

表: http://i.imgur.com/YBI3NSp.png

如何在我的Controller代码中解决这个问题?

1 个答案:

答案 0 :(得分:4)

根据我的理解,您可能希望扩展IdentityUserRole课程。 此类表示用户与其角色之间的关系。

public class AccountRole: IdentityUserRole<TKey>
{
    public override TKey RoleId
    {
        get;
        set;
    }
    public override TKey UserId
    {
        get;
        set;
    }
    public IdentityUserRole()
    {
    }

    public string somenewproperty(){
        get; set;
    }
}

然后我相信您必须覆盖createUserRole中的userManager或更具体的RoleManager

public class ApplicationRoleManager : RoleManager<IdentityRole> {
 //...And so on
}

Check out this link for a full overview of the identity management

我真正得到的是为什么你想要首先做到这一点。 您可以向Roles表添加新角色,并将该角色与某些规则联系起来,在这种情况下,您只需使用内置RoleManager为用户分配角色。

await userManager.AddToRoleAsync(userId, AccountRole.Admin);

在这种情况下,您的AccountRole将是Enum

public enum AccountRole {
    Admin,
    User
}

为了使这项工作成功,您必须将角色添加到数据库中,如下所示:

 context.Roles.Add(new IdentityRole("SomeRoleNameHere"));

最好在Seed方法中完成;

然后你有了注册方法:

[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    //Do the register of the user
    //Next:
    await UserManager.AddToRoleAsync(userId, AccountRole.Admin);
}

这会将用户添加到&#34; Admin&#34;如果添加正确。 现在,如果您查看数据库,AspNetUserRoles将使您的UserId和RoleId相互匹配。

如果你不能让它工作,你也可以创建一个静态类,我在之前的项目中做了这个。 它的工作方式与#34;角色名称相同。对象看起来像这样:

public static class RoleNames {
    public const string Supervisor = "Supervisor";
    public const string Administrator = "Administrator";
}

所有其他的东西 - 比如在种子方法中将它们添加到数据库中等等都是完全相同的。 并将其添加到用户:

await userManager.AddToRoleAsync(UserId, RoleNames.Supervisor);