ASP.NET标识 - 自定义身份验证的步骤

时间:2014-08-02 20:16:58

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

Envrionment:Visual Studio 2013,ASP.NET MVC 5

在我将要开发的基于MVC5的新项目中,我需要使用以自己的方式存储用户名,密码和角色的自定义数据库。我正在互联网上搜索自定义身份验证的示例。看起来像旧式的会员提供商"课程已被新的"身份"机制。

然而,找到一个好的循序渐进的例子已被证明是徒劳的。有一些链接(今年发布)讨论了实现自定义IPrincipalDbContext类。其他一些链接谈论实施IUserLoginStoreIUserPasswordStore。其他一些人则暗示要实施IUserIUserStore接口。

也许最后一个选项是需要的。有人可以指导我这些步骤或指向任何有简单示例的链接吗?类似的东西:

  1. 根据MyUser
  2. 实施IUser
  3. 根据MyUserStore
  4. 实施IUserStore
  5. 修改web.config以使用MyUserStore
  6. DefaultConnection移除web.config,因为不需要
  7. 问候。

2 个答案:

答案 0 :(得分:4)

首先,停下来。不要再考虑"自定义身份验证"。您不需要自定义身份验证,只需要自定义存储身份验证数据。

ASP.NET Identity从身份验证过程中抽象出了身份验证的存储机制。有几个接口遵循模式IxxxStore ..例如IUserStore,IRoleStore等......

您可以在此处找到有关此内容的更多信息,以及各种数据库的自定义实现,您可以根据自己的需要进行转换。

http://odetocode.com/blogs/scott/archive/2014/01/20/implementing-asp-net-identity.aspx

例如,这是一个RavenDB实现,它使用单个类中的所有各种接口。

https://github.com/tugberkugurlu/AspNet.Identity.RavenDB/blob/master/src/AspNet.Identity.RavenDB/Stores/RavenUserStore.cs

但是,所有这些都假设您确实需要完全不同地存储数据。如果您只需要将数据存储在不同的列中,那么它可能就像在IdentityContext中覆盖OnModelCreating并更改正在使用的列的名称一样简单。

答案 1 :(得分:0)

ad.1。

public class ApplicationUser :IUser
    {
        public string Id
        {
            get; 
            set;
        }

        public string UserName
        {
            get;
            set;
        }
    }

ad.2。

 public class MyStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser>, IUserSecurityStampStore<ApplicationUser>, IUserEmailStore<ApplicationUser>
    {
... //implement all interfaces here 
}

广告。 3。 现在您可以创建applicationUserManagerService(您将需要IdentityMessageService和IDataProtectionProvider):

 var applicationUserManagerService = new ApplicationUserManagerService(new MyStore(), emailService, dataProtectionProvider);

尝试使用IoC并注册您的IUserStore(我这样做了 - 链接如下):

unityContainer.RegisterType<IUserStore<ApplicationUser>, MyStore>();

在这里检查我的答案(我在那里使用int作为UserId): AspIdentiy ApplicationUserManager is Static, how to extend so it participates in my IoC framework?