2011-11-23 50 views
0

我们目前正在研究基于声明的身份验证,并使用WIF测试自定义STS。将声明存储在数据库中 - 模式建议?

我们一直在讨论如何在数据库中存储索赔。 在很多简单的例子中,权利要求作为简单的属性存储在一个单一的表格(例如UserProfile)中,该表格具有FK给用户。 然后生成声明,声明类型是URL加上列名称(例如http://.../claims/email),该值当然是数据库中的值。

但我需要更复杂的例子。你可以分享一些在数据库中存储声明的方法吗? 我想到的东西就像一个包含所有声明类型的表,以及一个包含每个用户值的表(包含用户的FK)。但我们真的需要一些灵感。因此,任何你可以分享的东西都将非常感激。 但同样,这是一个很“平”的结构......

更新

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

对不起,斜面发表图片呢。

我认为这对简单的声明很好。但是如果我有我称之为“嵌套索赔”的话。 可以说,声明类型描述了用户有权声明描述他对权利要求类型“文档”的资源“人员”的权利。 可以使用该模型进行描述,但如果我们想进一步描述该声明,该怎么办。假设用户对资源“人员”具有访问权限级别5。我看不出这是怎么可能的。有任何想法吗?

+0

索赔是一个平面结构。它们不能嵌套。因此,索赔将是.../Personnel/1或.../Personnel/5(即两个不同的索赔)。最终,它只是一个你在RP端解析的字符串。 – nzpcmad

+0

或者您可以创建一个复杂的类型并将其序列化,如下所示:http://msdn.microsoft.com/en-us/library/ms734687.aspx。你对这种方法有什么看法? – Kirk

+0

这是围绕序列化构建的WCF。我不知道STS功能可以让你像这样通过索赔。您可以在RP端创建复杂的对象ala http://www.syfuhs.net/post/2011/11/12/Strongly-Typed-Claims.aspx – nzpcmad

回答

0

两件事情,你不妨考虑:

不同的依赖方(RP)可以产生相同的用户要求的不同群体。所以你需要一个链接到索赔类型的RP表。

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

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

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

+0

感谢您的意见。他们都注意到了。我查看了Identity Server,但据我所知,它使用内置的ASP.NET Membership Provider,并添加了如下声明:claims.Add(new Claim(ProfileClaimPrefix + prop.Name.ToLowerInvariant(),value )); (ProviderUserRepository.cs)。也是一个非常扁平的结构。 – Kirk

+0

我用一个数字对我的例子进行了更新。你对此有何看法? – Kirk

+0

看看。你是否将某些用户锁定到某个RP?通常任何用户都可以访问RP。你可以在RP中做什么取决于你的要求。如果不需要,我会删除将用户绑定到RP的表格。因此,一旦通过身份验证,找到RP使用的声明,然后根据用户对这些声明的值填充声明。标准不会传递null声明,如果声明值为空,则不要构造声明。 – nzpcmad