代码之家  ›  专栏  ›  技术社区  ›  empz

在ASP.NET web应用程序之外获取用户管理器实例?

  •  3
  • empz  · 技术社区  · 7 年前

    我有一个ASP.netmvc5web应用程序,具有ASP.NET身份(个人帐户)。但我需要能够从控制台应用程序注册新用户。

    因此,我将把一些ASP.NET标识类从web应用移到一个类库中,以便在web应用和CLI之间共享。

    我已成功移动了以下内容:

    public class PortalDbContext : IdentityDbContext<PortalUser>
    {
        public PortalDbContext(string connectionString)
            : base(connectionString, throwIfV1Schema: false)
        {
        }
    
        public static PortalDbContext Create(string connectionString)
        {
            return new PortalDbContext(connectionString);
        }
    }
    
    public class PortalUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<PortalUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
    
            // Add custom user claims here
            return userIdentity;
        }
    }
    
    public class PortalUserManager : UserManager<PortalUser>
    {
        public PortalUserManager(IUserStore<PortalUser> store) : base(store)
        {
        }
    
        public async Task<IdentityResult> RegisterUser(string email, string password)
        {
            PortalUser user = new PortalUser { UserName = email, Email = email };
    
            return await this.CreateAsync(user, password);
        }
    }
    

    IUserStore<PortalUser> 这个 PortalUserManager 需要来自。

    在web应用程序中,此管理器从 HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>()

    2 回复  |  直到 7 年前
        1
  •  1
  •   John H    7 年前

    看看 OwinRequestScopeContext nuget包。它允许您使用上下文而不依赖于 System.Web . 我将添加当前自述文件中的示例,以避免只有链接的答案:

    # Usage 
    
    // using Owin; you can use UseRequestScopeContext extension method.
    
    // enabled timing is according to Pipeline.
    // so I recommend enable as far in advance as possible.
    app.UseRequestScopeContext();
    
    app.UseErrorPage();
    app.Run(async _ =>
    {
        // get global context like HttpContext.Current.
        var context = OwinRequestScopeContext.Current;
    
        // Environment is raw Owin Environment as IDictionary<string, object>.
        var __ = context.Environment;
    
        // optional:If you want to change Microsoft.Owin.OwinContext, you can wrap.
        new Microsoft.Owin.OwinContext(context.Environment);
    
        // Timestamp is request started(correctly called RequestScopeContextMiddleware timing).
        var ___ = context.Timestamp;
    
        // Items is IDictionary<string, object> like HttpContext.Items.
        // Items is threadsafe(as ConcurrentDictionary) by default.
        var ____ = context.Items;
    
        // DisposeOnPipelineCompleted can register dispose when request completed(correctly RequestScopeContextMiddleware underling Middlewares finished)
        // return value is cancelToken. If call token.Dispose() then canceled register.
        var cancelToken = context.DisposeOnPipelineCompleted(new TraceDisposable());
    
        // OwinRequestScopeContext over async/await also ConfigureAwait(false)
        context.Items["test"] = "foo";
        await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
        var _____ = OwinRequestScopeContext.Current.Items["test"]; // foo
    
        await Task.Run(() =>
        {
            // OwinRequestScopeContext over new thread/threadpool.
            var ______ = OwinRequestScopeContext.Current.Items["test"]; // foo
        });
    
        _.Response.ContentType = "text/plain";
        await _.Response.WriteAsync("Hello OwinRequestScopeContext! => ");
        await _.Response.WriteAsync(OwinRequestScopeContext.Current.Items["test"] as string); // render foo
    });
    
        2
  •  0
  •   empz    7 年前

    Create(string connectionString) PortalUserManager 这将创建 UserStore DbContext 并返回管理器的新实例。

    public class PortalDbContext : IdentityDbContext<PortalUser>
    {
        public PortalDbContext(string connectionString)
            : base(connectionString, throwIfV1Schema: false)
        {
        }
    
        public static PortalDbContext Create(string connectionString)
        {
            return new PortalDbContext(connectionString);
        }
    }
    
    public class PortalUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<PortalUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
    
            // Add custom user claims here
            return userIdentity;
        }
    }
    
    public class PortalUserManager : UserManager<PortalUser>
    {
        public PortalUserManager(IUserStore<PortalUser> store) : base(store)
        {
        }
    
        public static PortalUserManager Create(string connectionString)
        {
            UserStore<PortalUser> userStore = new UserStore<PortalUser>(PortalDbContext.Create(connectionString));
    
            PortalUserManager manager = new PortalUserManager(userStore);
    
            // Configure validation logic for usernames
            manager.UserValidator = new UserValidator<PortalUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = true,
                RequireUniqueEmail = true                
            };
    
            // Configure validation logic for passwords
            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 6,
                RequireNonLetterOrDigit = true,
                RequireDigit = true,
                RequireLowercase = true,
                RequireUppercase = true,
            };
    
            return manager;
        }
    
        public async Task<IdentityResult> RegisterUser(string email, string password)
        {
            PortalUser user = new PortalUser { UserName = email, Email = email };
    
            return await this.CreateAsync(user, password);
        }
    }