C# 获取用户';角色

C# 获取用户';角色,c#,asp.net,asp.net-mvc,asp.net-mvc-5,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,Asp.net Identity,你有一个ASP.NETMVC5网站,我想检索当前用户的角色(如果有的话),并相应地采取行动。我注意到了一些变化,即使是在模板中的VS2013测试版之后。我目前正在使用以下代码: //in Utilities.cs class public static IList<string> GetUserRoles(string id) { if (id == null) return null; var Use

你有一个ASP.NETMVC5网站,我想检索当前用户的角色(如果有的话),并相应地采取行动。我注意到了一些变化,即使是在模板中的VS2013测试版之后。我目前正在使用以下代码:

    //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());

这应该是可行的,但只是一个提示,在1.1-alpha1位中,我们添加了中间件和扩展方法,这样每个请求都会创建一次UserManager,并且可以重用,因此您可以调用以下命令,而不是在应用程序代码中创建新的UserManager:

owinContext.GetUserManager<UserManager<MyUser>>() 
owinContext.GetUserManager()
这也应该保证您得到相同的实体实例,因为您没有创建不同的数据库上下文

如果更新为夜间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())
            }
        });
//配置用户管理器
app.UseUserManagerFactory(新的UserManagerOptions()
{
AllowOnlyAlphanumericUserNames=false,
RequireUniqueEmail=true,
DataProtectionProvider=app.GetDataProtectionProvider(),
Provider=new UserManagerProvider()
{
OnCreateStore=()=>newuserstore(新的ApplicationDbContext())
}
});
然后您可以更改AccountController以从上下文中拾取它:

    private UserManager<ApplicationUser> _userManager;
    public UserManager<ApplicationUser> UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUser>();
        }
        private set
        {
            _userManager = value;
        }
    }
private UserManager\u UserManager;
公共用户管理器用户管理器{
得到
{
返回_userManager??HttpContext.GetOwinContext().GetUserManager();
}
专用设备
{
_userManager=value;
}
}

RoleProvider具有内置的caching@MaxToro我使用的代码是否使用了您提到的缓存?如果没有,请阅读我提供的更新,并帮助我提供一个小样本?目前没有身份缓存。角色扮演者很老了membership@HaoKung我目前的方法有多有效?谢谢你。我真的很感谢你的帮助。另外,ASP.Net团队中有人回答了如此多的帖子,而不仅仅是MSDN,这也很好。尽管只有一个问题。如果我理解正确,这是不可用的。请您解释一下什么是
owinContext
,它出来后我该如何使用?或者发个链接让我找到正确的方向?非常感谢。如果您想尝试最新的myget每晚订阅源,它是可用的。我将用AccountController/Startup.Auth.cs更改的区域来更新我的答案。谢谢很抱歉打扰你,但有三个简单的问题:1。这将在何时发布,2。如果alpha有可能破坏我的网站,我害怕使用它。我可以只使用这一部分还是升级整个东西?我应该升级什么?Net还是MVC模板?3.当这个版本发布时,除了上面的代码之外,我是否应该更改任何东西来使用它?我的意思是我的项目,控制器中的代码等等。我没有任何关于日期的信息,Identity.EF包中有破坏模式的更改,但是核心不应该引入任何破坏性的更改。这些更改将出现在MVC模板中,除非您真的需要alpha1提供的东西,否则您可能现在就想等待。
    private UserManager<ApplicationUser> _userManager;
    public UserManager<ApplicationUser> UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUser>();
        }
        private set
        {
            _userManager = value;
        }
    }