4

我很难理解如何定义索赔。网上有很多关于创建声明的信息,但似乎没有一个同意。我在不同的帖子中发现了索赔的四个属性:

  • 索赔类型
  • 索赔价值
  • 值类型
  • 正确的

假设您要创建声明,表示用户有权编辑用户对象,那么设置这些属性的正确方法是什么?

此外,在 WIF 中似乎没有“Right”属性的属性。“Right”是否仅在 WCF 上下文中使用?

我很困惑,求助!

编辑:

感谢您的回复。为了更具体一点,我目前看到我的自定义声明有两个选项:

1-ClaimType=编辑,ClaimValue=用户

2-ClaimType=Action,ClaimValue=EditUser

选项一似乎更“基于声明”,而选项似乎更“基于角色”。想法?

4

2 回答 2

4

.Net中有两种不同的Claim类型。一个在 WIF ( Microsoft.IdentityModel.Claims) 中,一个System.IdentityModel.Claims在 WCF pre-WIF 中使用(虽然它不是 WCT 的一部分)。只有你提到的System.IdentityModel.Claims.Claim有一个属Right​​性。

我已经在 WCF 和 ASP.Net 中使用了声明方法,无论是否使用 WIF,WIF 编程模型肯定是两者中更简单的。

对于您描述的用户编辑场景,我将定义一个具有合适名称的角色。UserEditor 可能没问题,但听起来很具体。您应该查看要授予这些用户的所有权限的集合,并提出一个合适的汇总名称(可能是 UserAdministrator?)。

对于这些用户,您应该添加角色声明(即http://schemas.microsoft.com/ws/2008/06/identity/claims/role或类型Microsoft.IdentityModel.Claims.ClaimTypes.Role)。如果您的身份提供者在您的应用程序外部并且您无法控制它发出的声明,那么您将需要ClaimsAuthenticationManager通过添加新的角色声明来实现自定义来转换已发布的声明集。

然后你可以装饰你想要授予访问权限的操作,PrincipalPermissionAttribute如下所示:

[PrincipalPermission(SecurityAction.Demand, Role = "UserAdministrator")]

该框架相当灵活,可以在 ASP.Net、WCF 或常规 .Net 开发中以多种不同方式使用。您的问题没有提供很多背景信息,无法通过示例给出非常具体的答案。

于 2012-02-03T20:52:03.417 回答
2

我不确定您在哪里读到声明应该具有正确的属性,我认为这是对该概念的滥用。

一组声明本身并不传达用户权利。相当:

声明集 +策略= 用户权限。

通常,基于声明的应用程序将策略应用于一组传入用户声明以做出授权决策。基于角色的访问是最常见的,因此这些决策可能像 User.IsInRole("Manager") 一样简单,它只是检查用户是否拥有 ClaimType="http://schemas.microsoft.com/ ws/2008/06/identity/claims/role”和 ClaimValue="Manager"。

在线酒类商店可能要求用户年满 21 岁,在这种情况下,您可以查看年龄声明。但是,对于本网站的加拿大版本,您将有不同的政策,其中年龄限制可能为 18 岁。如果此类“权利”是通过索赔本身传达的,那么这种政策灵活性将是不可能的。

于 2012-02-03T19:41:11.320 回答