ASP.NET 具有多个应用程序的身份

ASP.NET Identity with multiple applications

所以我们的组织正在使用 asp.net mvc 和 web api 开发一些新的网络应用程序。我们决定不将活动目录用于 authentication/authorization 目的,因此看起来 asp.net 身份和 entity framework 可能会起作用。

查看数据库架构,我没有看到应用程序 table 因此我们可以拥有一个用于用户凭据和应用程序访问的中央存储库。这是索赔的来源吗?那看起来怎么样?用户 -> 应用 -> 角色 -> 权限

另外,我们的目标之一是也为用户提供单点登录。新的不记名令牌可能吗?

感谢您提供的任何帮助

对于单点登录,可以共享 cookie 或使用不同的会话状态,例如 <sessionState mode="SQLServer"><sessionState mode="StateServer"> https://msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx

您的用户及其凭据存储在 AspNetUser table 中,角色存储在 ASPNetRole 中,而 AspNetUserRole 作为两者之间的连接点 table映射用户和角色。您可以通过在您的应用程序中共享这些 table 来实现 SSO(单点登录)。就像每个应用程序都需要读取这些 table 和角色以及登录用户一样。但更好的方法是创建一个中央 WebApi 来处理用户身份验证和授权。

另外,如果您的角色可以在 运行 时间更改,那么您就知道权限,您可以创建一个自定义 Table 来存储权限,然后将角色映射到权限。当用户登录时,只需加载他的所有权限并存储为声明。您可以序列化整个角色(及其权限列表)并将其存储为一个声明。或者将每个权限存储为最适合您的个人声明。

看看这个教程。它展示了如何使用 Web API:

实现 ASP.NET Identity

http://bitoftech.net/2015/01/21/asp-net-identity-2-with-asp-net-web-api-2-accounts-management/

至于处理多个应用程序。我想到的两种方法是:

  1. AppId 添加到所有用户名
  2. AppId 列添加到 AspNetUsers table,派生自 UserStore 并重新实现基于 Find 的方法,以便查询考虑AppId

对于 #1,当应用程序想要创建一个新用户时,它会向包含新用户信息和 AppId 的 WebApi 发送一个请求。然后 WebApi 将连接 UserNameAppId 以创建将写入数据库的完整用户名。因此,如果应用程序 1234 想要创建一个用户名为 myuser 的用户,那么 WebApi 将创建一个用户名为 myuser_1234 的新用户。从那时起,在查询数据库时,您首先会从请求中获取 UserNameAppId,将它们连接起来,然后查询数据库。

如果另一个应用程序 9900 想要创建一个 myuser,那么写入数据库的最终用户名将是 myuser_9900.

您可能希望将应用程序详细信息存储在数据库中,并针对每个请求验证 AppId 以确保您在处理请求之前识别该应用程序。

我没有考虑太多步骤 #2,所以它只是一个建议。

如果你想在多个应用程序之间共享用户凭据,那么你可以忽略上面的内容,使用标准功能,让所有应用程序指向同一个数据库,从而允许所有应用程序访问所有用户,而不管是哪个应用程序创建了哪个用户。

更新#1:在这种情况下可以使用不记名令牌,我认为(凭记忆)上面提到的教程系列涉及到这个以及单个 WebApi 如何为多个应用程序提供令牌。