在Identity 2.0 </iuser>中成功实现自定义UserManager <iuser>

时间:2014-10-14 17:11:05

标签: c# asp.net-web-api asp.net-identity owin asp.net-identity-2

我正在尝试导航黑洞,这是身份会员的自定义实现。我现在的目标只是从ApiController获取此行以正确检索我的UserManager:

public IHttpActionResult Index()
{
    var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<MyUser,int>>();
    //manager is null
}

这是我的设置。在我的Startup配置中,我设置了WebApi并添加了我的OwinContext:

app.CreatePerOwinContext<UserManager<MyUser,int>>(Create);

我的创建方法:

public static UserManager<User,int> Create(IdentityFactoryOptions<UserManager<MyUser,int>> options, IOwinContext context)
{
   return new UserManager<MyUser,int>(new UserStore(new DbContext()));
}

其余的是我可以做的最基本的实现。

MYUSER:

public class MyUser : IUser<int>
{
    public int Id { get; set; }
    public string UserName { get; set; }
}

MyUserStore:

 public class MyUserStore : IUserStore<MyUser,int>
 {
    private IdentityDbContext context;
    public MyUserStore(IdentityDbContext c)
    {
       context = c;
    }

    //Create,Delete, etc implementations
 }

MyDbContext:

 public class MyDbContext : IdentityDbContext
 {
     public MyDbContext() : base("Conn")
     {

     }
 }

这一切都是为了学习身份如何运作,我相信没有人真正知道。我希望能够最终完全自定义我的用户和角色,避免使用Microsoft的IdentityUser。

同样,我现在的问题是,在我的控制器中,我在尝试检索我的UserManager时收到null

非常感谢任何和所有帮助。

2 个答案:

答案 0 :(得分:3)

我有几个错误,但主要的是我的Startup类看起来像:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseWebApi(new WebApiConfig());

        app.CreatePerOwinContext(MyDbContext.Create);
        app.CreatePerOwinContext<MyUserManager>(MyUserManager.Create);
    }
}

当然,OWIN管道会在触发WebAPI调用之后插入我的依赖。切换那些是我的主要问题。

此外,我终于在Google搜索中找到了this great guide。它几乎可以回答我所得到的一切。我需要实现一个UserManager<MyUser,int>

的具体类

我希望以后可以帮助别人。

答案 1 :(得分:1)

您使用的是MyIdentity.User还是MyIdentity.MyUser?您有两个不同的对象传递到示例中的TUser参数。

我测试了您的实现,并且在检索UserManager的已注册实例时没有遇到任何问题。

要完全自定义您的用户和角色,您需要最终编写UserManager的新实现,以便使您的身份验证,声明,角色,方法调用等能够正常工作。

如果您正在尝试了解Identity的工作原理,我建议您使用UserManager和IdentityUser的默认实现。先让它工作。

Here is a good tutorial

最终,创建自己的用户实现IdentityUser。所有UserManager功能都可以使用,您将可以访问新属性。其他属性将自动构建到IdentityDbContext生成的AspnetUser表中。

public MyIdentityUser : IdentityUser
{
   public int Id {get; set;}
   public string CustomUserId {get; set;}
   public string UserId { get; set; }
}

或者您可以开始使用对其他对象的外键引用构建自定义MyIdentityUser。

public MyIdentityUser : IdentityUser
{
   public virtual UserProperties Properties { get; set; }
}

这对你有帮助吗?