使用ASP.NET Identity如何实现多租户用户登录

25
我正在开发一个多租户解决方案,我想使用最新的ASP.NET Identity框架,特别是Entity Framework实现。
基本上,我需要允许两个用户拥有相同的用户名,但它必须在一个租户内是唯一的,我还想利用外部登录,如Twitter、Microsoft、Facebook和Google。
从我所了解的情况来看,该框架并不是为多租户而设计的,但它似乎允许扩展性。我更喜欢尽可能多地利用现有组件,但目前我认为我将不得不放弃Entity Framework实现,并自己编写所有代码。
是否有其他人尝试过这样做,他们需要编写多少代码?

1
дҪ еҸҜд»Ҙе°Ҷз§ҹжҲ·7зҡ„з”ЁжҲ·JimеңЁеҶ…йғЁеӯҳеӮЁе’ҢеӨ„зҗҶдёә7\JimгҖӮ - Slauma
进展如何?目前我们正在实现相同的事情。2.0版有什么改进吗?这个库需要一些改进还是出现了问题? - Bart Calixto
@Bart,没问题,看看我的回答:https://dev59.com/2WIj5IYBdhLWcg3wpWlx#20230452 - James Skimming
2个回答

28

我现在有一个可用的解决方案,已经在GitHub存储库中分享:

https://github.com/JSkimming/AspNet.Identity.EntityFramework.Multitenant

支持多租户所需的可扩展性在Microsoft.AspNet.Identity.EntityFramework 1.0.0版本中是不可能实现的(至少没有大量自定义工作),但是可以在夜间ASP.NET Web Stack NuGet Packages中的1.1 alpha版本中获得。

我决定将我所制作的发布为NuGet包AspNet.Identity.EntityFramework.Multitenant,如上所述,它目前需要夜间ASP.NET Web Stack NuGet Packages

我提供了两个简单的站点,利用该软件包以实现多租户:

  1. Vanilla Implementation是使用字符串主键的标准MVC5模板项目。
    • 提供多租户所需的更改已被隔离到此提交中。
  2. 整型主键实现进行了一些自定义,以使用整型主键。
  • 提供多租户所需的更改已被隔离到此提交中。

我计划在ASP.NET Identity 1.1版本发布时更新该解决方案。

我希望其他人能在我发布的nuget包中找到有用的东西,欢迎提供任何反馈并且请报告您发现的任何问题


更新

该解决方案现已更新为使用Microsoft.AspNet.Identity.EntityFramework 2.0


嗨,詹姆斯,这正是我在当前项目中所需要的,但我在添加它时遇到了麻烦。首先,命名空间AspNet.Identity.EntityFramework.Multitenant;无法工作,我已经有了正确版本的EF,是否有什么明显的问题我应该检查?谢谢。 - Fred Johnson
谢谢你做这个。我的问题是,这个能像Facebook/Google/Microsoft登录那样实现吗?也就是说,我有一个多个项目。当用户从任何项目中点击登录时,我希望他们进入这个通用的登录网站,让(你的代码)让他们登录或使用FB/G/MS,然后将我需要的(身份+声明)返回到他们来自的任何网站。就像如果我将FB/G/MS集成到任何网站中一样,它实际上会去到FB/G/MS,进行身份验证并返回到我的网站。所以,就像FB/G/MS登录一样无缝,我想要这个多租户站点。 - Grandizer
@JamesSkimming 感谢您的出色工作, James。有没有关于如何开始使用您的示例解决方案的文档?或者在其他地方可以获得更完整的示例项目吗?我看到您将tenantid传递给AccountController构造函数,但我有点不知所措如何继续下去。 - darren
@mongoose_za 一旦设置了tenantid,您应该能够像以前一样使用UserManager,这是意图。 - James Skimming
你好,能否更新到2.2版本,并在登录时设置用户租户上下文,以便只为他的租户过滤表格? - Transformer
显示剩余2条评论

3

是的,我们明确将此作为可扩展性方案。您可以通过重写UserManager属性和实现自己的自定义IUserStore来完成此操作。尽管您也可能能够扩展EF UserStore并将tenantId添加到用户中。


感谢您的回复,非常感激。我一直在研究夜间构建版本,因为它们允许模型的更大的可扩展性。我目前正在原型开发一个解决方案。 - James Skimming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接