自定义令牌和Windows Identity Foundation

时间:2011-12-21 08:27:51

标签: .net wcf wcf-security wif

我有一个网络服务,我希望获得授权。但是对于登录用户必须输入用户名,密码和他的公司标识符。标准WCF身份验证类仅支持用户名和密码,因此我决定使用自定义令牌创建自定义凭据。我从Microsoft(wcf sample description)看到自定义令牌示例应用程序,我可以运行它。但现在真正的问题。在服务器端,我想使用Windows Identity Foundation(没有STS - 授权应该在自定义SecurityTokenHandler中执行。我已经创建了这个处理程序:

public class MyCustomTokenHandler : SecurityTokenHandler
{
    public override string[] GetTokenTypeIdentifiers()
    {
        //this is invoked correctly
        return new string[] { Constants.CreditCardTokenNamespace };
    }
    public override Type TokenType
    {
        get
        {
            //this is invoked correctly
            return typeof(CreditCardToken);
        }
    }

    public override bool CanReadToken(XmlReader reader)
    {
        //this is invoked correctly
        if (reader.IsStartElement(Constants.CreditCardTokenName, Constants.CreditCardTokenNamespace))
            return true;
        return false;
    }

    public override SecurityToken ReadToken(XmlReader reader)
    {
        //read token code - it is invoked correctly
    }

    public override bool CanValidateToken
    {
        get
        {//this is not invoked
            return true;
        }
    }

    public override ClaimsIdentityCollection ValidateToken(SecurityToken token)
    {
        //this is not invoked
        IClaimsIdentity identity = new ClaimsIdentity();
        identity.Claims.Add(new Claim(WSIdentityConstants.ClaimTypes.Name, "Test"));

        return new ClaimsIdentityCollection(new IClaimsIdentity[] { identity });
    }
}

出于测试目的,我创建了继承自UserNameSecurityTokenHandler的第二个处理程序:

public class CustomUserNameSecurityTokenHandler : UserNameSecurityTokenHandler
{
    public override bool CanValidateToken
    {
        get
        {//this is invoked but it shouldn't!!!
            return true;
        }
    }

    public override ClaimsIdentityCollection ValidateToken(SecurityToken token)
    {
        ...
    }
}

我已经在web.config中注册了它们:

<microsoft.identityModel>
<service>
  <securityTokenHandlers>
    <remove type="Microsoft.IdentityModel.Tokens.WindowsUserNameSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add type="Microsoft.Samples.CustomToken.CustomUserNameSecurityTokenHandler, CreditCardToken"/>
    <add type="Microsoft.Samples.CustomToken.MyCustomTokenHandler, CreditCardToken"/>
  </securityTokenHandlers>     
</service>

客户端应用程序正确发送我的CreditCardToken(这是来自wcf示例应用程序的客户端)。但在Web服务方面,我有以下行为:

  1. 调用MyCustomTokenHandler中的TokenType和GetTokenTypeIdentifiers(好)
  2. 调用来自MyCustomTokenHandler的方法CanReadToken和ReadToken(好)
  3. 不调用MyCustomTokenHandler的方法CanValidateToken和ValidateToken(错误)
  4. 调用CustomUserNameSecurityTokenHandler的方法CanValidateToken(错误,因为客户端应用程序发送了不同的令牌)
  5. 在finall中我得到例外:
  6.   

    无法找到“Microsoft.Samples.CustomToken.CreditCardToken”令牌类型的令牌身份验证器。根据当前的安全设置,不能接受该类型的标记。

    该消息告诉我这种类型令牌的令牌验证器,但我知道WIF中的令牌处理程序用于此目的。

    您能否告诉我应该怎么做才能强制WIF使用MyCustomTokenHandler进行验证(身份验证)?

0 个答案:

没有答案