我正在尝试使用Microsoft.IndentityModel(= Windows Indentity Foundation)为STS实现自定义SecurityToken
和SecurityTokenHandler。
令牌被序列化为带签名的简单xml文档(使用X509证书),有时(并非总是)加密(取决于目标域)。
直到现在它运作得很好,但我被SecurityTokenHandler.CreateSecurityTokenReference(SecurityToken token, bool attached)卡住了,应该返回SecurityKeyIndetifierClause
。
我的问题是:一般来说,SecurityKey
,SecurityKeyIndentifier
和SecurityKeyIndentifierClause以及我的sceanrio(rsa签名(和加密)xml令牌)具体是什么?
MSDN中几乎没有任何文档,我找不到任何有助于此主题的内容。
提前致谢。
P.S。:我知道最简单和推荐的方法是使用像saml这样的令牌格式的构建,但令牌由遗留系统评估,遗留系统需要特定的格式,我没有影响。
答案 0 :(得分:2)
与此同时,我找到了自己问题的答案:
<强> SecurityKey 强>
SecurityKey用于加密操作。承载令牌实现不需要这样做。因此,您只需在 SecurityToken 的相应属性中返回一个空列表:
public override ReadOnlyCollection<SecurityKey> SecurityKeys
{
get { return new List<SecurityKey>().AsReadOnly(); }
}
<强> SecurityKeyIdentifierClause 强>
正如另一个答案所指出的, SecurityKeyIdentifierClause 是安全令牌的唯一标识符。 SecurityTokenResolver 使用它为指定的 SecurityKeyIdentifierClause 返回相应的 SecurityToken 。
您自己的 SecurityTokenHandler 实施的最佳解决方案可能是将您的令牌ID作为 localId 参数返回LocalIdKeyIdentifierClause:
public override SecurityKeyIdentifierClause CreateSecurityTokenReference(SecurityToken token, bool attached)
{
if (token == null)
throw new ArgumentNullException("token");
return new LocalIdKeyIdentifierClause(token.Id);
}
<强> SecurityKeyIdentifier 强>
SecurityKeyIdentifier 是 SecurityKeyIdentifierClauses 的集合。如果需要,您可以在此处使用 System.IdentityModel.Tokens 中的实现。通常没有必要自己照顾这个。
答案 1 :(得分:0)
密钥标识符与自定义令牌一起使用以执行一些操作。它们描述了令牌,和/或指向其他相关令牌(因为令牌可能只是指针 - 可能是出于性能原因等)。如果您不需要密钥标识符,则可以执行以下两项操作:
从CanWriteKeyIdentifierClause返回false:
public override bool CanWriteKeyIdentifierClause(SecurityKeyIdentifierClause securityKeyIdentifierClause) { 返回false; }
从CreateSecurityTokenReference返回默认值(或null):
public override SecurityKeyIdentifierClause CreateSecurityTokenReference(SecurityToken token,bool attach) { return default(SecurityKeyIdentifierClause); }