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/
至于处理多个应用程序。我想到的两种方法是:
- 将
AppId
添加到所有用户名
- 将
AppId
列添加到 AspNetUsers
table,派生自 UserStore
并重新实现基于 Find
的方法,以便查询考虑AppId
对于 #1,当应用程序想要创建一个新用户时,它会向包含新用户信息和 AppId
的 WebApi 发送一个请求。然后 WebApi 将连接 UserName
和 AppId
以创建将写入数据库的完整用户名。因此,如果应用程序 1234
想要创建一个用户名为 myuser
的用户,那么 WebApi 将创建一个用户名为 myuser_1234
的新用户。从那时起,在查询数据库时,您首先会从请求中获取 UserName
和 AppId
,将它们连接起来,然后查询数据库。
如果另一个应用程序 9900
想要创建一个 myuser
,那么写入数据库的最终用户名将是 myuser_9900
.
您可能希望将应用程序详细信息存储在数据库中,并针对每个请求验证 AppId
以确保您在处理请求之前识别该应用程序。
我没有考虑太多步骤 #2,所以它只是一个建议。
如果你想在多个应用程序之间共享用户凭据,那么你可以忽略上面的内容,使用标准功能,让所有应用程序指向同一个数据库,从而允许所有应用程序访问所有用户,而不管是哪个应用程序创建了哪个用户。
更新#1:在这种情况下可以使用不记名令牌,我认为(凭记忆)上面提到的教程系列涉及到这个以及单个 WebApi 如何为多个应用程序提供令牌。
所以我们的组织正在使用 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 Identityhttp://bitoftech.net/2015/01/21/asp-net-identity-2-with-asp-net-web-api-2-accounts-management/
至于处理多个应用程序。我想到的两种方法是:
- 将
AppId
添加到所有用户名 - 将
AppId
列添加到AspNetUsers
table,派生自UserStore
并重新实现基于Find
的方法,以便查询考虑AppId
对于 #1,当应用程序想要创建一个新用户时,它会向包含新用户信息和 AppId
的 WebApi 发送一个请求。然后 WebApi 将连接 UserName
和 AppId
以创建将写入数据库的完整用户名。因此,如果应用程序 1234
想要创建一个用户名为 myuser
的用户,那么 WebApi 将创建一个用户名为 myuser_1234
的新用户。从那时起,在查询数据库时,您首先会从请求中获取 UserName
和 AppId
,将它们连接起来,然后查询数据库。
如果另一个应用程序 9900
想要创建一个 myuser
,那么写入数据库的最终用户名将是 myuser_9900
.
您可能希望将应用程序详细信息存储在数据库中,并针对每个请求验证 AppId
以确保您在处理请求之前识别该应用程序。
我没有考虑太多步骤 #2,所以它只是一个建议。
如果你想在多个应用程序之间共享用户凭据,那么你可以忽略上面的内容,使用标准功能,让所有应用程序指向同一个数据库,从而允许所有应用程序访问所有用户,而不管是哪个应用程序创建了哪个用户。
更新#1:在这种情况下可以使用不记名令牌,我认为(凭记忆)上面提到的教程系列涉及到这个以及单个 WebApi 如何为多个应用程序提供令牌。