我正在开发要在 Azure 中托管的 MVC 4 应用程序,并希望使用他们的 ACS 服务进行身份验证。用户通过身份验证后,我将使用生成的索赔详细信息与我的本地记录相关联。在此之后,我想扩展声明集以包括代表本地授权的其他声明,我的应用程序将用于授权决策。我假设我需要替换 Principle,但我不确定在 MVC 中的何处/何时执行此操作,并且希望避免破坏通常在整个会话生命周期中使用的任何身份验证管道。任何人都可以对此有所了解吗?
2 回答
WIF 中用于丰富声明集的扩展点是ClaimsAuthenticationManager
从文档:
声明身份验证管理器在 RP 处理管道中提供了一个可扩展点,您可以使用它在调用 RP 应用程序之前过滤、修改或将新声明注入到由 IClaimsPrincipal 提供的声明集中。
您还可以在 ACS 中添加规则,以使用您需要的声明来丰富令牌。
除了@Eugenio Pace 所说的之外,值得注意的是,您可以在以下位置添加和删除声明IClaimsPrincipal
:
public static void UpdateClaims(IClaimsIdentity identity)
{
identity.Claims.Remove(identity.Claims.SingleOrDefault(x => x.ClaimType == ClaimTypes.Name));
identity.Claims.Remove(identity.Claims.SingleOrDefault(x => x.ClaimType == ClaimTypes.Email));
identity.Claims.Add(new Claim(ClaimTypes.Name, "Steve Smith"));
identity.Claims.Add(new Claim(ClaimTypes.Email, "steve@smith.com"));
}
UpdateClaims(User.Identity as IClaimsIdentity);
添加的声明可以是 中枚举的类型之一,也可以是ClaimTypes
您自己设计的自定义字符串。您可以添加多个类型的声明ClaimTypes.Role
- 我不确定其他类型。
从ClaimsCollection
文档:
表示与单个主题相关联的声明集合。
通过调用 SetSubject 方法,将声明添加到 ClaimCollection 隐式地将该声明与与该集合关联的主题相关联。
通过调用 SetSubject 方法,从 ClaimCollection 中移除 Claim 会隐式移除此关联。
http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.claims.claimcollection.aspx
更新
对于 .Net 4.5,身份类和更新声明的方法以及命名空间都发生了变化:
using System.IdentityModel;
using System.Security.Claims;
public static void UpdateClaims(Member member, ClaimsIdentity identity)
{
identity.RemoveClaim(identity.Claims.SingleOrDefault(x => x.Type == ClaimTypes.Name));
identity.RemoveClaim(identity.Claims.SingleOrDefault(x => x.Type == ClaimTypes.Email));
identity.AddClaim(new Claim(ClaimTypes.Name, "Steve Smith"));
identity.AddClaim(new Claim(ClaimTypes.Email, "steve@smith.com"));
}
UpdateClaims(User.Identity as ClaimsIdentity);
http://msdn.microsoft.com/en-us/library/system.security.claims.claimsidentity.aspx