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

时间:2010-08-18 17:36:43

标签: wcf identity wif federated-identity actas

这是我到目前为止所做的:

1)创建了一个ASP.NET MVC依赖方应用程序,并使用ADFS v2.0保护它。这很有效。

2)使用ASP.NET网站的Claims-Aware服务模板创建了WCF服务。我已经为服务打开了ASP.NET兼容性,因为否则服务不会激活。我已将所述服务的界面移至'SharedContracts'程序集。

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

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

我现在要做的是使用ActAs与服务进行交流。换句话说,当某人从ASP.NET MVC站点点击HomeController.Index()时,其中包含一个充满声明的令牌(请记住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 个答案:

答案 0 :(得分:0)

在TechNet上查看本指南,了解如何设置您所描述的方案:

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

在他们的示例中,我相信他们使用的是标准WebForms,但在MVC的情况下,您可以将ChannelFactory初始化放在Application_Start中的Global.asax中。