这是我到目前为止所做的:
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();
}
当我尝试调用该方法时,我收到以下错误消息:
该工厂启用了手动寻址,因此所有发送的消息都必须预先寻址。
我很确定我在以编程方式配置绑定和端点方面做得还不够。如果你们中的任何人以前做过这个或者你知道怎么做,我希望能够让它工作。
底线是我只是在使用基本的身份委托方案——唯一的区别是我没有使用生成的客户端代理。