我正在尝试调用已针对ADFS保护的WCF服务(netmsmq端点)。我需要打开一个包含应用程序上下文中已发布令牌的通道。
下面的代码是我尝试这样做的,但是,我得到以下异常:
签名令牌System.IdentityModel.Tokens.SamlSecurityToken没有 键。安全令牌用于需要它的上下文中 执行加密操作,但令牌不包含 加密密钥。令牌类型不支持 加密操作,或特定令牌实例不 包含加密密钥。检查您的配置以确保这一点 加密禁用令牌类型(例如, UserNameSecurityToken)未在需要的上下文中指定 加密操作(例如,支持令牌)。
我知道此错误消息与BearerKey令牌有关,但是,netMsmqBinding不会公开属性binding.Security.Message.IssuedKeyType = SecurityKeyType.BearerKey;
怎么办?是否可以使用已颁发的令牌调用netmsmq服务?它seems所以。
public string CallServiceQueue()
{
try
{
var binding = new NetMsmqBinding(NetMsmqSecurityMode.Message);
binding.Security.Message.ClientCredentialType = MessageCredentialType.IssuedToken;
var ep = new EndpointAddress("net.msmq://localhost/private/service/helloqueue.svc");
var factory = new ChannelFactory<IHelloQueue>(binding, ep);
factory.Credentials.SupportInteractive = false;
factory.Credentials.UseIdentityConfiguration = true;
factory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySerialNumber, "74 0A FE 19 E9 F0 53 9C 46 D9 F2 D6 56 A7 0C E8");
var context = (BootstrapContext)((ClaimsIdentity)Thread.CurrentPrincipal.Identity).BootstrapContext;
var channel = factory.CreateChannelWithIssuedToken(context.SecurityToken);
channel.SayHello();
((IServiceChannel)channel).Close();
return "Your message has been sent.";
}
catch (SecurityException)
{
return "Access denied.";
}
catch (Exception ex)
{
return ex.Message;
}
}