Asp.Net MVC 授权扩展 ApplicationUser 的自定义用户

Asp.Net MVC authorize a custom user which extends ApplicationUser

我正在使用内置的 authentication/authorization 系统,其中 ApplicationUser 需要登录,一旦通过身份验证,他就会使用 SignInManager 登录。

我还有一个不同的用户 CustomUser,它扩展了 ApplicationUserCustomUser 通过外部服务进行身份验证。一旦他通过身份验证,我检查他是否存在,如果不存在我创建他并给他 CustomRole.

我怎样才能保持 CustomUser 的授权?我希望能够放置 [Authorize(Roles="CustomRole")] 属性高于他应该被允许的行为。那可能吗?我需要做什么才能完成这项工作?或者有更好的方法吗?

编辑

下面是 CustomUser 的实现。它位于 Application.Models

public class CustomUser : ApplicationUser
{
    public int Gender
    {
        get;
        set;
    }

    public string FCode
    {
        get;
        set;
    }

    public bool Subscribed
    {
        get;
        set;
    }
}

这是 CustomUser 的简化版本。

您应该能够为角色执行如下操作:

[Authorize(Roles = "CustomRole")]
public ActionResult CustomRoleOnly()
{
    return View();
}

或者如果它是针对用户

 [Authorize(Users = "JoeBloggs, JaneDoe")]
 public ActionResult SpecificUserOnly()
 {
     return View();
 }

如果你想按角色授权,你需要创建 Roles 使用:

userManager.AddToRole(user.Id, "NameOfRole");

您可以像下面这样创建注册操作,任何注册用户都来自一个角色。您可以为 Manager 创建其他角色并稍后更新特定用户。

using (var context = new ApplicationDbContext())
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
        var result = await UserManager.CreateAsync(user, model.Password);

        if (result.Succeeded)
        {
            await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                        //adding a role after register
            var roleStore = new RoleStore<IdentityRole>(context);
            var roleManager = new RoleManager<IdentityRole>(roleStore);

            var userStore = new UserStore<ApplicationUser>(context);
            var userManager = new UserManager<ApplicationUser>(userStore);
            userManager.AddToRole(user.Id, "SimpleUser");
            // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
            // Send an email with this link
            // 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");
        }
        AddErrors(result);
    }
}

然后在你的授权属性上你可以使用Roles来授权。

[Authorize(Roles="Manager, SimpleUser, so on..")]