Почему UserManager Identity не распознает метод Create в методе конфигурации? - PullRequest
0 голосов
/ 29 января 2019

Я новичок в ASP.NET Identity, создал простой процесс входа и зарегистрировал делегатов в методе конфигурации IdentityConfig моего проекта.

Я пытаюсь зарегистрировать их, но *Классы 1004 * и RoleManager не распознают метод Create.

public class IdentityConfig
{
    public void Configuration(IAppBuilder app)
    {
        app.CreatePerOwinContext<UserManager<AppUsers>>(UserManager<AppUsers>.Create);
        app.CreatePerOwinContext<RoleManager<AppRole>>(RoleManager<AppRole>.Create);

        app.CreatePerOwinContext(() => new UsersPhonesDBContext());

        app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) =>
            new RoleManager<AppRole>(
                new RoleStore<AppRole>(context.Get<UsersPhonesDBContext>())));

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Home/Login"),
        });
    }
}

Метод входа:

public ActionResult Login()
{
    var userManager = HttpContext.GetOwinContext().GetUserManager<UserManager<AppUsers>>();
    var roleManager = HttpContext.GetOwinContext().GetUserManager<RoleManager<AppRole>>();
    var authManager = HttpContext.GetOwinContext().Authentication;

    AppUsers user = userManager.FindByName("MyName");
    if (user != null)
    {
        var ident = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);

        //use the instance that has been created. 
        authManager.SignIn(
            new AuthenticationProperties { IsPersistent = false }, ident);

        return Redirect(Url.Action("Index", "Rest"));
    }

    // AppUsers user= userManager.Find("Hunain","");
    return View();
}

Обновление:

Я написал класс AppUserManager и метод внутри него:

public class AppUserManager: UserManager<AppUsers>
    {
        public AppUserManager(IUserStore<AppUsers> store): base(store)
        {
        }

        // this method is called by Owin therefore best place to configure your User Manager
        public static AppUserManager Create(
            IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
        {
            var manager = new AppUserManager(
                new UserStore<AppUsers>(context.Get<UsersPhonesDBContext>()));

            // optionally configure your manager
            // ...

            return manager;
        }
    }

Still

var manager = new AppUserManager(
                    new UserStore<AppUsers>(context.Get<UsersPhonesDBContext>()

выдает ошибку.

Значение не может быть нулевым.

My DB context class:



 public class UsersPhonesDBContext: IdentityDbContext<AppUsers>
    {
        public UsersPhonesDBContext()
            : base("UsersPhonesDBContext")
        {
            Database.SetInitializer<UsersPhonesDBContext>(null);
        }

        public DbSet<Users> PhoneUsers { get; set; }
        public DbSet<Phones> Phones { get; set; }
        public DbSet<Sims> Sims { get; set; }
    }

1 Ответ

0 голосов
/ 29 января 2019

Я не уверен, откуда вы взяли этот код, но нет статического метода с именем Create для UserManager<T> или RoleManager<T>.Согласно некоторым учебникам вы должны написать этот метод самостоятельно:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
    return manager;
}

Как видите, это просто метод для создания правильного типа UserManager<T>.В данном случае это пользовательский менеджер пользователей с именем ApplicationUserManager.

В этом ответе SO также упоминаются части одного и того же кода.

...