你有一个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);
}
答案 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;
}
}