获得用户角色的最快方式

时间:2013-11-15 03:23:16

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

你有一个ASP.Net MVC 5网站,我想检索当前用户的角色(如果有的话),并据此采取行动。即使在模板中的VS 2013测试版之后,我也注意到了一些变化。我目前正在使用此代码:

    //in Utilities.cs class
    public static IList<string> GetUserRoles(string id)
    {
        if (id == null)
            return null;

        var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new AppContext()));
        return UserManager.GetRoles(id);
    }

    //and I call it like this:
    var roles = Utilities.GetUserRoles(User.Identity.GetUserId());

这是最好的方法吗?如果没有,那是什么?

编辑:

我使用它来创建角色并将用户添加到角色中:

RoleManager.Create(new IdentityRole("admin"));
if (um.Create(user, password).Succeeded)
{
   UserManager.AddToRole(user.Id, role);
}

1 个答案:

答案 0 :(得分:1)

这应该可行,但只是一个抬头,在1.1-alpha1位中,我们添加了中间件和扩展方法,因此每个请求将创建一次UserManager并且可以重复使用,因此不会创建新的UserManager您的应用代码,您可以致电:

owinContext.GetUserManager<UserManager<MyUser>>() 

这也应该保证你获得实体的相同实例,因为你没有创建不同的db上下文。

如果你更新到每晚的1.1 alpha位,你需要将它添加到Startup.Auth.cs的顶部以注册创建userManager的新中间件:

        // Configure the UserManager
        app.UseUserManagerFactory(new UserManagerOptions<ApplicationUser>()
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true,
            DataProtectionProvider = app.GetDataProtectionProvider(),
            Provider = new UserManagerProvider<ApplicationUser>()
            {
                OnCreateStore = () => new UserStore<ApplicationUser>(new ApplicationDbContext())
            }
        });

然后您可以更改AccountController以从上下文中选择它:

    private UserManager<ApplicationUser> _userManager;
    public UserManager<ApplicationUser> UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUser>();
        }
        private set
        {
            _userManager = value;
        }
    }