我无法将ApplicationRoleManager添加到startup.auth

时间:2014-12-02 08:12:23

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

问题很简单,我正在尝试在我的应用程序中实现角色,而且如果不是我去的所有地方,请告诉我在startup.auth中使用以下行:

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

问题是,Visual studio一直告诉我ApplicationRoleManager不存在!我已经搜索了不同的方法来实现这个,但是每个人都在说“使用ApplicationRoleManager”,但我不能使用它,显然,我已经得到了它所需的库。

这里非常欢迎任何帮助。

显然,我的应用程序没有自动生成ApplicationRoleManager代码,所以我试图手动添加它。在IdentityConfig.Cs中,我添加了以下代码:

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
        : base(roleStore)
    {
    }
}

此时我卡住了,因为显然我需要其他方法(比如create方法)来完成这项工作,但我找不到任何要添加的代码示例。

编辑我目前正在尝试实施工厂来实施角色管理。但是我遇到了VS没有检测到某些物体的问题,这里有一张图片可以更好地展示它:

Capture

我已经在nuget中更新了我的身份包,我仍然遇到了库的问题。

1 个答案:

答案 0 :(得分:1)

您正在创建工厂以创建角色管理器。因此,create方法是您应该实现的唯一方法。但说实话,如果你不想要,你也不需要。所以有两种方法可以做到这一点:

app.CreatePerOwinContext<RoleManager<IdentityRole>>(new RoleManager<IdentityRole>(new RoleStore<IdentityRole, string>(new SomeContext()));

或者您可以创建一个工厂来为您完成:

public class RoleManagerFactory
{
    private readonly IDbContextFactory<SomeContext> contextFactory
    public RoleManagerFactory(IDbContextFactory<SomeContext> contextFactory)
    {
         this.contextFactory = contextFactory;
    }

    public RoleManager<IdentityRole> Create()
    {
        return new RoleManager<IdentityRole>(new RoleStore<IdentityRole, string>(contextFactory.Create()));
    }

    // If you have already instantiated a context to use, then you can pass it in here
    public RoleManager<IdentityRole> Create(SomeContext context)
    {
        return new RoleManager<IdentityRole>(new RoleStore<IdentityRole, string>(context));
    }
}

var factory = new RoleManagerFactory();
app.CreatePerOwinContext<RoleManager<IdentityRole>>(factory.Create());

我相信这些方法比你想做的更容易。

<强> 修改

我添加了上下文工厂,因为我记得你需要将一个上下文传递给角色存储。所以EntityFramework已经作为IDbContextFactory<TContext>接口,所以你只需要创建一个具体的实现并实现接口,这是另一个Create方法,你返回一个新的上下文:new SomeContext()

这就是我在我的应用中所做的。实际上,我使用依赖注入并根据请求创建角色管理器。我使用这个工厂,以便我可以将角色管理器注入我的类:

public interface IRoleManagerFactory
{
    RoleManager<IdentityRole> Create();
}

所以在我的课程中我可以这样做:

public class RoleController : Controller
{
    private readonly IRoleManagerFactory roleManagerFactory;

    public RoleController (IRoleManagerFactory roleManagerFactory)
    {
         this.roleManagerFactory = roleManagerFactory;
    }

    // Create method
    public async Task<JsonResult> CreateRole(string role)
    {
        using (var roleManager = this.roleManagerFactory.Create())
        {
            var result = await roleManager.CreateAsync(role);

            return Json(new { succeeded: result.Succeeded });
        }
    }
}

<强> 修改

我已正确使用角色管理器和数据库上下文更新了示例。