用于WIF的自定义SecurityTokenHandler

时间:2011-07-11 15:07:36

标签: c# .net wif sts-securitytokenservice

我正在尝试使用Microsoft.IndentityModel(= Windows Indentity Foundation)为STS实现自定义SecurityTokenSecurityTokenHandler

令牌被序列化为带签名的简单xml文档(使用X509证书),有时(并非总是)加密(取决于目标域)。

直到现在它运作得很好,但我被SecurityTokenHandler.CreateSecurityTokenReference(SecurityToken token, bool attached)卡住了,应该返回SecurityKeyIndetifierClause

我的问题是:一般来说,SecurityKeySecurityKeyIndentifierSecurityKeyIndentifierClause以及我的sceanrio(rsa签名(和加密)xml令牌)具体是什么?

MSDN中几乎没有任何文档,我找不到任何有助于此主题的内容。

提前致谢。

P.S。:我知道最简单和推荐的方法是使用像saml这样的令牌格式的构建,但令牌由遗留系统评估,遗留系统需要特定的格式,我没有影响。

2 个答案:

答案 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); }