我有一个网络服务,我希望获得授权。但是对于登录用户必须输入用户名,密码和他的公司标识符。标准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服务方面,我有以下行为:
无法找到“Microsoft.Samples.CustomToken.CreditCardToken”令牌类型的令牌身份验证器。根据当前的安全设置,不能接受该类型的标记。
该消息告诉我这种类型令牌的令牌验证器,但我知道WIF中的令牌处理程序用于此目的。
您能否告诉我应该怎么做才能强制WIF使用MyCustomTokenHandler进行验证(身份验证)?