WCF NetMsmq安全性

时间:2013-11-25 03:11:06

标签: wcf security claims-based-identity adfs

我正在尝试调用已针对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;
        }
    }

0 个答案:

没有答案