0

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

1) 创建了一个 ASP.NET MVC 依赖方应用程序并使用 ADFS v2.0 对其进行保护。这行得通。

2) 使用声明感知服务模板为 ASP.NET 网站创建了 WCF 服务。我已经打开了服务的 ASP.NET 兼容性,因为否则服务不会激活。我已将所述服务的接口移至“SharedContracts”程序集。

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

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

我现在想做的是使用 ActAs 与服务交谈。换句话说,当有人从 ASP.NET MVC 站点使用充满声明的令牌(请记住 MVC 站点是依赖方)点击 HomeController.Index() 时,我希望此方法以编程方式创建客户端代理并调用单个我在 WCF 服务上使用的服务方法(一种称为“HelloClaim”的方法,几乎​​与声明感知服务模板附带的库存方法相同)。

这是我到目前为止的代码:

[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();
}

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

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

我很确定我在以编程方式配置绑定和端点方面做得还不够。如果你们中的任何人以前做过这个或者你知道怎么做,我希望能够让它工作。

底线是我只是在使用基本的身份委托方案——唯一的区别是我没有使用生成的客户端代理。

4

1 回答 1

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 中。

于 2010-08-18T18:03:14.460 回答