代码之家  ›  专栏  ›  技术社区  ›  Kevin Hoffman

以编程方式为WIF安全的WCF服务创建客户端代理

  •  0
  • Kevin Hoffman  · 技术社区  · 14 年前

    以下是我迄今为止所做的:

    2) 使用声明感知服务模板为ASP.NET网站。我转过身来ASP.NET上的服务的兼容性,因为该服务在其他情况下不会激活。我已将上述服务的接口移动到“SharedContracts”程序集。

    3) 使用“addsts”引用将WCF服务设置为依赖方,同时指向我的ADFS服务器。

    4) 将ADFS服务器配置为包含WCF服务作为依赖方,并向其发出LDAP声明。

    我现在要做的是使用ActAs与服务对话。换句话说,当有人HomeController.索引()从ASP.NETMVC站点有一个充满声明的令牌(记住MVC站点是一个依赖方),我希望这个方法以编程方式创建一个客户机代理,并调用我在WCF服务上拥有的单一服务方法(一个名为“HelloClaim”的方法,它几乎与stock相同)声明感知服务模板附带的方法)。

    以下是我目前掌握的代码:

    [ValidateInput(false)]
    public ActionResult Index()
    {
      SecurityToken callerToken = null;
    
      IClaimsPrincipal claimsPrincipal = Thread.CurrentPrincipal as IClaimsPrincipal;
      if (claimsPrincipal != null)
      {
        foreach (IClaimsIdentity claimsIdentity in claimsPrincipal.Identities)
        {
          if (claimsIdentity.BootstrapToken is SamlSecurityToken)
          {
            callerToken = claimsIdentity.BootstrapToken;
            break;
          }
        }
    
        string baseAddress = "http://khoffman2/SecureServices/Service.svc";
    
        ChannelFactory<IHelloClaim> factory = new ChannelFactory<IHelloClaim>(new WebHttpBinding(), new EndpointAddress(baseAddress));
        factory.ConfigureChannelFactory<IHelloClaim>();
        IHelloClaim hello = factory.CreateChannelActingAs<IHelloClaim>(callerToken);
    
        string result = hello.HelloClaim();
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
      }
    
    
    
      return View();
    }
    

    当我尝试调用该方法时,会收到以下错误消息:

    此工厂启用了手动寻址,因此发送的所有消息都必须预先寻址。

    我敢肯定,我只是在以编程方式配置绑定和端点方面做得不够。如果你们中的任何一个以前做过这个或者知道怎么做,我很乐意让这个工作。

    归根结底,我只是利用了基本的身份委托场景——唯一的区别是我没有使用生成的客户端代理。

    1 回复  |  直到 11 年前
        1
  •  0
  •   Kwal    14 年前

    请看TechNet上的这本指南,其中有一个关于如何设置您描述的场景的演练:

    http://technet.microsoft.com/en-us/library/adfs2-identity-delegation-step-by-step-guide(WS.10).aspx