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