【问题标题】:Rolemanager always null in Identity 2.0Rolemanager 在 Identity 2.0 中始终为空
【发布时间】:2014-10-15 20:07:30
【问题描述】:

我看到了这个问题。但答案对我不起作用。

我创建了一个空的 asp.net 网站。 .NET 4.5

我通过 Install-Package Microsoft.AspNet.Identity.Sample -pre 在 nuget 中安装了示例

我无法让初始化程序运行。所以我做了以下

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
        this.Database.Initialize(true);
    }

    static ApplicationDbContext()
    {
        // Set the database intializer which is run once during application start
        // This seeds the database with admin user credentials and admin role
        //

    }` `

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

角色管理器始终为空。我尝试了其他答案,但它们从未奏效。除了上面显示的内容外,我没有更改示例。那么为什么它不起作用呢?数据库和表是创建的。角色管理器在下面使用,为空。

 public static void InitializeIdentityForEF(ApplicationDbContext db)
    {
        var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
        const string name = "admin@example.com";
        const string password = "Admin@123456";
        const string roleName = "Admin";

        //Create Role Admin if it does not exist
        var role = roleManager.FindByName(roleName);
        if (role == null)

【问题讨论】:

  • 使用 RoleManager 的代码 sn-p 在哪里?
  • 添加了它。您可以看到它只是示例中的样板代码。加上 web.config 中的 owin:Startup 也没有改变
  • 我也有同样的问题...

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


【解决方案1】:

刚刚完成这项工作,并想出了:

public static void InitializeIdentityForEF(ApplicationDbContext context)
        {
            context.Configuration.LazyLoadingEnabled = true;

            //var userManager = HttpContext.Current
            //    .GetOwinContext().GetUserManager<ApplicationUserManager>();

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

            var roleStore = new RoleStore<ApplicationRole, int, ApplicationUserRole>(context);
            var roleManager = new RoleManager<ApplicationRole, int>(roleStore);
            var userStore = new UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>(context);
            var userManager = new UserManager<ApplicationUser, int>(userStore);   
...

这似乎解决了我的 Seed 方法中的其余问题。我在使用 Create 和 FindByName 的 RoleManager/UserManager 异步方法时遇到了一些问题,建议同步执行所有操作。

【讨论】:

  • 这对我有帮助,除非您使用的版本与我不同,或者因为我的版本更像:var roleStore = new RoleStore&lt;IdentityRole&gt;(context);var roleManager = new RoleManager&lt;IdentityRole&gt;(roleStore);var userStore = new UserStore&lt;ApplicationUser&gt;(context);var userManager = new UserManager&lt;ApplicationUser&gt;(userStore);
【解决方案2】:

我试试这个,问题解决了。

在「App_Start\Startup.Auth.cs」中

public partial class Startup
{
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and role manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
        ...
    }
}

只是

参考 HttpContext.GetOwinContext().GetUserManager<AppRoleManager>() return null

【讨论】:

  • 如果你能更好地解释一下为什么它实际上是解决问题的方法,它可能有助于改进答案
  • 对我来说“app.CreatePerOwinContext(ApplicationRoleManager.Create);”不在 Startup.Auth.cs 代码中,这就是 RoleManager 为 NULL 的原因。
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2014-12-09
  • 2017-01-03
相关资源
最近更新 更多