123asd1235as 1 Ответов: 1

Настойчивость-невежество ASP.NET идентичность с паттернами и configureoauthtokengeneration


Я давно этим пользуюсь шаблон для реализации ASP.NET Identity 2.2 с чистой архитектурой DDD. Однако; когда я хочу использовать ConfigureOAuthTokenGeneration, он требует, чтобы CreatePerOwinContext знал ваш DbContext и экземпляр UserManager/RoleManager с DbContext . обычно я бы пошел с:

private void ConfigureOAuthTokenGeneration(IAppBuilder app)
    {
        app.CreatePerOwinContext(AppDbContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        app.CreatePerOwinContext(ApplicationRoleManager.Create);

        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = false,
            TokenEndpointPath = new PathString("/oauth/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new CustomOAuthProvider(),
            AccessTokenFormat = new CustomJwtFormat(ConfigurationManager.AppSettings["ApiPath"])
        };

        app.UseOAuthAuthorizationServer(OAuthServerOptions);
    }

Rolemanager сведения о:

public class ApplicationRoleManager : RoleManager
{
    public ApplicationRoleManager(IRoleStore roleStore)
        : base(roleStore)
    {
    }

    public static ApplicationRoleManager Create(IdentityFactoryOptions options, IOwinContext context)
    {
        var appRoleManager = new ApplicationRoleManager(new RoleStore(context.Get()));

        return appRoleManager;
    }
}

UserManager:

public class ApplicationUserManager : UserManager
{
    public ApplicationUserManager(IUserStore store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context)
    {
        var appDbContext = context.Get();
        var appUserManager = new ApplicationUserManager(new UserStore(appDbContext));

        return appUserManager;
    }
}

Проблема в том,что когда я хочу передать UserManager и RoleManager в CreatePerOwinContext, для этого требуется метод Create, как описано выше, я не знаю, как реализовать их с помощью RoleStore/UserStore, который я создал, так как их конструктор принимает мой IIdentityContext и в пределах вышеуказанных классов я не могу ввести свой IIdentityContext вот моя реализация RoleStore/UserStore:

Что я уже пробовал:

RoleStore:

public class RoleStore : IRoleStore,
    IQueryableRoleStore,
    IDisposable
{
    private readonly IIdentityContext _context;
    public RoleStore(IIdentityContext context)
    {
        _context = context;
    }
}

UserStore:

public class UserStore : IUserLoginStore,
    IUserClaimStore,
    IUserRoleStore,
    IUserPasswordStore,
    IUserSecurityStampStore,
    IUserStore, IDisposable
{
    private readonly IIdentityContext _context;

    public UserStore(IIdentityContext context)
    {
        _context = context;
    }

}

И Мой IIdentityContext:

public interface IIdentityContext : IUnitOfWork
{
    IUserRepository Users { get; }
    IRoleRepository Roles { get; }
}

1 Ответов

Рейтинг:
4

Richard Deeming

Попробуйте что-нибудь вроде этого:

Измените свой ApplicationRoleManager и ApplicationUserManager классы для использования DI вместо заводского метода:

public class ApplicationRoleManager : RoleManager
{
    public ApplicationRoleManager(IRoleStore roleStore) : base(roleStore)
    {
    }
}

public class ApplicationUserManager : UserManager
{
    public ApplicationUserManager(IUserStore store) : base(store)
    {
    }
}
Убедиться, что они зарегистрированы в ваш контейнер:
public static void RegisterComponents()
{
    var container = new UnityContainer();
    ...
    
    container.RegisterType<ApplicationRoleManager>(new TransientLifetimeManager());
    container.RegisterType<ApplicationUserManager>(new TransientLifetimeManager());

    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
Изменить CreatePerOwinContext вызовы для разрешения экземпляров с помощью контейнера DI:
private void ConfigureOAuthTokenGeneration(IAppBuilder app)
{
    app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());
    app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationRoleManager>());
    ...