C# 使用自定义角色初始化ASP.NET标识中的角色管理器

C# 使用自定义角色初始化ASP.NET标识中的角色管理器,c#,asp.net,asp.net-identity,C#,Asp.net,Asp.net Identity,我使用教程将用户数据库的主键从string更改为int,但初始化角色管理器时遇到困难。它以前是使用 var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); var角色管理器=新角色管理器(新角色存储(上下文)); 如何使用新数据创建角色管理器 更新:我正在使用MVC 5和EF 6。根据您的问题,我无法确定您是否使用相同的框架(MVC和EF) 最近,我使

我使用教程将用户数据库的主键从string更改为int,但初始化角色管理器时遇到困难。它以前是使用

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
var角色管理器=新角色管理器(新角色存储(上下文));
如何使用新数据创建角色管理器


更新:我正在使用MVC 5和EF 6。

根据您的问题,我无法确定您是否使用相同的框架(MVC和EF)

最近,我使用自定义ApplicationUsers和IdentityRoles创建了一个MVC+EF解决方案。 ApplicationUser源于“Microsoft.AspNet.Identity.EntityFramework.IdentityUser”。 应用程序角色的实现没有任何更改

我有以下课程:

// Configure the used in the application. RoleManager is defined in the ASP.NET Identity core assembly
    public class ApplicationRoleManager : RoleManager<IdentityRole>
    {
        public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
            : base(roleStore)
        {
        }

        public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
        {
            return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
        }
    }
//配置应用程序中使用的。角色管理器在ASP.NET标识核心程序集中定义
公共类应用程序RoleManager:RoleManager
{
公共应用程序角色管理器(IRoleStore角色存储库)
:底座(roleStore)
{
}
公共静态应用程序角色管理器创建(IdentityFactoryOptions选项,IOwinContext上下文)
{
返回新的ApplicationRoleManager(新的RoleStore(context.Get());
}
}
在configuration.cs(迁移)==>中的“更新数据库”将执行此操作

    var roleStore = new RoleStore<IdentityRole>(context);
    var roleManager = new RoleManager<IdentityRole>(roleStore);
    var applicationRoleAdministrator = new IdentityRole("Administrator");
    if (!roleManager.RoleExists(applicationRoleAdministrator.Name))
    {
       roleManager.Create(applicationRoleAdministrator);
    }
// do some logic to find your applicationUserAdministrator
var applicationUserAdministrator = userManager.FindByName("Administrator");
userManager.AddToRole(applicationUserAdministrator.Id, applicationRoleAdministrator.Name);
var-roleStore=新的roleStore(上下文);
var roleManager=新roleManager(roleStore);
var applicationRoleAdministrator=新标识(“管理员”);
如果(!roleManager.RoleExists(applicationRoleAdministrator.Name))
{
创建(applicationRoleAdministrator);
}
//执行一些逻辑以找到您的应用程序管理员
var applicationSerAdministrator=userManager.FindByName(“管理员”);
userManager.AddToRole(applicationUserAdministrator.Id,applicationRoleAdministrator.Name);
使用startup.auth.cs将链接指向RoleManager:

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext(ApplicationRoleManager.Create);

您的
应用程序角色管理器可能如下所示。因为您必须从customRole类继承,而不是从
IdentityRole
继承

public class ApplicationRoleManager : RoleManager<CustomRole, int>
{
    public ApplicationRoleManager(IRoleStore<CustomRole, int> roleStore)
        : base(roleStore)
    {
    }

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        return new ApplicationRoleManager(new RoleStore<CustomRole, int, CustomUserRole>(context.Get<ApplicationDbContext>()));
    }
}
公共类应用程序RoleManager:RoleManager
{
公共应用程序角色管理器(IRoleStore角色存储库)
:底座(roleStore)
{
}
公共静态应用程序角色管理器创建(IdentityFactoryOptions选项,IOwinContext上下文)
{
返回新的ApplicationRoleManager(新的RoleStore(context.Get());
}
}
然后将以下代码添加到Startup.Auth.cs类(如果当前不存在)

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext(ApplicationRoleManager.Create);
然后创建和管理角色

    var roleManager = HttpContext.GetOwinContext().Get<ApplicationRoleManager>();

    const string roleName = "Admin";

    //Create Role Admin if it does not exist
    var role = roleManager.FindByName(roleName);
    if (role == null)
    {
        role = new CustomRole();
        role.Id = 1; // this will be integer
        role.Name = roleName;

        var roleresult = roleManager.Create(role);
    }
var rolemager=HttpContext.GetOwinContext().Get();
常量字符串roleName=“Admin”;
//如果角色Admin不存在,则创建该角色
var role=rolemager.FindByName(roleName);
如果(角色==null)
{
角色=新的CustomRole();
role.Id=1;//这将是整数
role.Name=roleName;
var roleresult=rolemanger.Create(角色);
}
希望这有帮助。

希望这有帮助

    var roleManager = new RoleManager<CustomRole,int>(new RoleStore<CustomRole,int,CustomUserRole>(context));
    var UserManager = new UserManager<ApplicationUser,int>(new UserStore<ApplicationUser,CustomRole,int,CustomUserLogin,CustomUserRole,CustomUserClaim>(context));

   // In Startup iam creating first Admin Role and creating a default Admin User     
    if (!roleManager.RoleExists("Admin")){
    //first we create Admin rool   
        var role = new CustomRole();
        role.Name = "Admin";
        roleManager.Create(role);
    }

    ////Here we create a Admin super user who will maintain the website     
    if (UserManager.FindByName("Admin") == null){
        var user = new ApplicationUser() { UserName = "Admin" };
        string userPWD = "adminadmin";
        var chkUser = UserManager.Create(user, userPWD);
        if (chkUser.Succeeded){
            var result1 = UserManager.AddToRole(user.Id, "Admin")
            ;
        }
    }
var角色管理器=新角色管理器(新角色存储(上下文));
var UserManager=newusermanager(newuserstore(context));
//在启动中,iam创建第一个管理员角色并创建默认管理员用户
如果(!roleManager.RoleExists(“Admin”)){
//首先,我们创建AdminRool
var role=新的CustomRole();
role.Name=“Admin”;
角色管理器。创建(角色);
}
////在这里,我们创建一个管理员超级用户谁将维护网站
if(UserManager.FindByName(“Admin”)==null){
var user=new ApplicationUser(){UserName=“Admin”};
字符串userPWD=“adminadmin”;
var chkUser=UserManager.Create(user,userPWD);
如果(chkUser.successed){
var result1=UserManager.AddToRole(user.Id,“Admin”)
;
}
}

我使用的是MVC 5和EF 6。如果您遵循本教程,他将为IdentityRole、UserStore和RoleStore创建自定义类。编译器不允许我使用<代码>新角色存储(上下文)检查我上面的答案。由于某种原因,一个项目中缺少startup.auth.cs行,并且角色经理没有初始化,这解决了我的问题。谢谢您将`[Authorize(Roles=“Edit”)]`在此之后自动工作?它应该按预期工作,手动将角色直接插入数据库之间没有区别..您能自动生成
角色.Id
。。。或者您是否有理由将
role.Id
明确定义为1。否,这取决于您如何配置数据库和标识角色表。在本例中,role.Id是整数,不是数据库自动生成的字段,因此我将其用作1,因为它是第一个角色。您可以自动生成角色id,但您需要配置实体框架来处理它。如果我使用
[Authorize(Roles=“Admin”)]
我会收到以下错误:
此版本的SQL Server不支持用户实例登录标志。连接将被关闭