【问题标题】:Storing claims in a database - schema suggestions?将声明存储在数据库中 - 架构建议?
【发布时间】:2014-02-09 23:53:28
【问题描述】:

我们目前正在研究基于声明的身份验证,并使用 WIF 测试自定义 STS。

我们一直在讨论如何在数据库中存储声明。 在许多简单示例中,声明作为简单属性存储在具有用户 FK 的单个表(例如 UserProfile)中。 然后生成声明,声明类型是 URL 加列名(例如http://.../claims/email),值当然是数据库中的值。

但我需要更复杂的示例。你能分享一些在数据库中存储索赔的方法吗? 我在想一个包含所有声明类型的表,以及一个包含每个用户的值的表(对用户有一个 FK)。但我们真的需要一些灵感。因此,您可以分享的任何内容将不胜感激。 但同样,这是一个非常“扁平”的结构......

更新

我试着做一个简单的模型:http://imageshack.us/photo/my-images/690/suggestionn.png/

抱歉,还不能发布图片。

我认为这对于简单的声明很有用。但是,如果我有我所谓的“嵌套声明”怎么办。 假设声明类型描述了用户有一个声明,该声明描述了他对声明类型“文档”的资源“人员”的权利。 这可以使用该模型进行描述,但是如果我们想进一步描述该声明怎么办。假设用户对资源“人员”具有 5 级访问权限。我看不出这怎么可能。有什么想法吗?

【问题讨论】:

  • 声明是一个扁平的结构。它们不能嵌套。所以索赔将是 .../Personnel/1 或 .../Personnel/5 (即两个不同的索赔)。最终,它只是一个您在 RP 端解析的字符串。
  • 或者您可以创建一个复杂类型并将其序列化,如下所述:msdn.microsoft.com/en-us/library/ms734687.aspx。您如何看待这种方法?
  • 那是围绕序列化构建的 WCF。我不知道允许您像这样传递声明的 STS 功能。您可以在 RP 端创建复杂对象 ala syfuhs.net/post/2011/11/12/Strongly-Typed-Claims.aspx
  • 这个想法是在 STS 端序列化它,并将它作为资源在声明中传递,不是吗?然后在 RP 端反序列化。
  • 同意 - 但声明是在 SAML 令牌中传递的,我认为它没有用于序列化复杂对象的方法。见social.msdn.microsoft.com/Forums/en-US/Geneva/thread/…

标签: database authentication wif claims


【解决方案1】:

您可能希望考虑两件事:

不同的信赖方 (RP) 可以为同一用户生成不同的声明组。因此,您需要一个链接到声明类型的 RP 表。

(注意:可以通过wtrealm参数区分哪个RP)。

此外,声明类型可以是一对多的。如果有一种类型 .../claims/groups 并且用户属于多个组,则该声明类型将有多个实例。

你看过Identity Server是如何实现这个的吗?它使用 SQL DB。

【讨论】:

  • 谢谢你们。他们都被注意到了。我查看了 Identity Server,但据我所知,它使用内置的 ASP.NET Membership 提供程序,并添加如下声明:claims.Add(new Claim(ProfileClaimPrefix + prop.Name.ToLowerInvariant(), value )); (ProviderUserRepository.cs)。也是一个非常扁平的结构。
  • 我用一个图更新了我的示例。你怎么看?
  • 看过了。您是否将某些用户锁定到某些 RP?通常任何用户都可以访问 RP。您可以在 RP 中做什么取决于您的索赔。如果不需要,我会删除将用户绑定到 RP 的表。因此,一旦经过身份验证,找到 RP 使用的声明,然后根据用户对这些声明的值填充声明。标准是不传递 null 声明,如果声明值为空,则不要构造声明。
  • 问题是所有用户都无法访问所有 RP。我们有一些内部和外部用户,外部用户不允许访问某些应用程序。你还觉得不对吗?您没有愿意分享的具体示例来说明如何将声明存储在数据库中。你呢?
  • 给我发一封电子邮件 - gmail.com 上的用户名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多