如何在没有实体框架的情况下使用 ASP.NET Identity 3.0 [关闭]
Posted
技术标签:
【中文标题】如何在没有实体框架的情况下使用 ASP.NET Identity 3.0 [关闭]【英文标题】:How to use ASP.NET Identity 3.0 without Entity Framework [closed] 【发布时间】:2015-10-26 01:29:07 【问题描述】:我现在看到的所有 ASP.NET Identity 3.0 示例都使用实体框架来存储与用户相关的数据。
是否有任何不使用实体框架且ApplicationUser
类不是从Microsoft.AspNet.Identity.EntityFramework.IdentityUser
派生的示例?
在 ASP.NET Identity 2.x 中需要实现IUser
接口。现在似乎没有这样的接口 - 所以我们不确定如何正确定义 User
类。几乎没有关于这个主题的文档。
第二个问题是AddIdentity
调用Startup.ConfigureServices
。它与 Microsoft.AspNet.Identity.EntityFramework
命名空间中的特定类非常相关,并且不清楚如何在没有这些类的情况下注册身份服务。
【问题讨论】:
这是一个很好且有效的示例 (MVC 6) 和实现库,带有 ASP.NET 5 Identity (>= v3) 框架,没有 MongoDB.Driver 实体框架 (>= v2.1.0) github.com/saan800/SaanSoft.AspNet.Identity3.MongoDB 这是关于一个常见问题的具体问题,每个版本的 Identity 都会发生变化:如何通过手术从 Identity 中删除 EF,以便可以使用其他数据访问技术。它与推荐工具无关。 @Martijn Pieters 您在关闭它之前是否阅读过这个问题?紧急重新打开这个问题! 【参考方案1】:我已经在我的项目中实现了,你要实现的主要是UserStore和RoleStore
我的 SiteUser 和 SiteRole 类不继承自任何东西
主要是在让asp.net身份添加自己的服务之前添加自己的服务
services.TryAdd(ServiceDescriptor.Scoped<IUserStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserPasswordStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserEmailStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserLoginStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserRoleStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserClaimStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserPhoneNumberStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserLockoutStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IUserTwoFactorStore<SiteUser>, UserStore<SiteUser>>());
services.TryAdd(ServiceDescriptor.Scoped<IRoleStore<SiteRole>, RoleStore<SiteRole>>());
一些相同的接口将在此处注册,但如果它们先注册,它将使用您的接口
services.AddIdentity<SiteUser, SiteRole>();
【讨论】:
谢谢。我们在解决方案中采用类似的方式。 不使用事务怎么解决? @gilmishal,我相信 UserStore 实现应该调用您的非 EF 存储库实现。如果这个存储库参与了一个工作单元,它可以使用事务,这可能会将事务的开始与动作的开始联系起来,将事务的结束与业务操作的结束联系起来,然后再返回动作结果。跨度> 并且在 Microsoft.AspNetCore.Identity 1.0.0 中有扩展方法来配置您自己的商店:services.AddIdentity<myAppUser, myAppRole>() .AddRoleStore<myAppRoleStore>() .AddUserStore<myAppUserStore>();
myAppRoleStore 必须实现 IRoleStore是否有任何不使用 EntityFramework 且 ApplicationUser 类不是从 Microsoft.AspNet.Identity.EntityFramework.IdentityUser 派生的示例?
由于 ASP.NET Identity 3 是 .NET Framework 5 的一部分,它仍未发布,我猜你不会找到任何示例。
在 ASP.NET Identity 2.x 中需要实现 IUser 接口。现在似乎没有这样的接口 - 所以我们不确定如何正确定义“用户”类。几乎没有关于这个主题的文档。
同样,缺少文档可能是由于该软件未发布的性质。然而,只看the source code,似乎ApplicationUser 可以从任何POCO 对象派生——无需实现IUser<TKey>
接口。
至于配置服务,请查看IdentityServiceCollectionExtensions
和IdentityEntityFrameworkBuilderExtensions
。似乎第一个是在身份核心中作为提供上下文的一种手段,在该上下文中注册应用程序身份的服务,而第二个是使用该上下文的特定于实体框架的实现。
实现使用 ASP.NET Identity 3 但不使用 EF 的解决方案似乎只是为身份服务接口提供不同的实现,然后在应用配置期间连接这些依赖项。您可以使用基本的 EntityFramework 实现作为如何 DIY 的指南。但是需要注意的是,身份 3 可能会在最终发布之前再次更改,因此您现在针对身份 3 构建的任何内容都可能会发生更改。
【讨论】:
即使现在发布了 .NET 5,关于将 EF 与 Identity 分离的文档仍然很少。我们确实想使用身份框架,但也想利用存储过程以及自定义用户、角色和分组机制的强大功能。以上是关于如何在没有实体框架的情况下使用 ASP.NET Identity 3.0 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 ASP.NET Core 的情况下将 Json 数据从控制器发送到 javascript?
如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x
如何在我的实体框架和 ASP.NET MVC 项目中重构 connectionString?