从Asp.Net将SAML令牌传递给WCF服务

时间:2012-03-27 01:43:25

标签: wcf forms-authentication single-sign-on wif adfs2.0

当我尝试从另一个asp.net应用程序(IP)验证的asp.net应用程序(RP)调用WCF服务时,我收到一条带有登录页面内容的错误消息(它正在尝试到达登录页面,因为它无法验证请求。)

身份提供者:_http://localhost/AuthenticatonWS/Login.aspx

依赖方网站:_http://localhost/RPWebsite/Default.aspx

WCF服务:_http://localhost/RPWebsite/Service1.svc

(在我的解决方案中,我从default.aspx.cs调用service1.svc)

我不希望该服务是匿名的。目前,该站点(RPWebsite)使用STS并信任本地身份提供商,但在生产中,它可以通过ADFS信任任何外部身份提供商。

任何人都可以指导我如何将令牌信息从aspx页面传递给服务,我确实从互联网上尝试了几个例子,但我无法让它工作。

2 个答案:

答案 0 :(得分:0)

问题很可能是RPWebsite在ClaimsAuthorizationModule中使用<system><httpModules><system.webserver><modules>中使用web.config。这会导致任何Web服务调用被重定向到STS进行身份验证,就像您观察到的那样是一个交互式浏览器请求。

或者,可以将此模块添加到web.config的WIF特定部分中,即<microsoft.identityModel><service>中,并且在此情况下,此模块仅用于基于声明的WCF Web服务调用。您可以使用以下格式添加它:<claimsAuthorizationManager type="MyNamespace.CustomClaimsAuthenticationManager, MyAssembly"/>。 (此类型必须扩展ClaimsAuthorizationManager,如WIF文档页面"ClaimsAuthenticationManager, ClaimsAuthorizationManager, and OriginalIssuer"中所述。)

参考文献:Vittorio Bertocci,“编程WIF”,p。 43。

答案 1 :(得分:0)

我认为有几种选择:

  1. 使用支持多个客户端会话的持久身份验证Cookie。或者支持RP和WCF服务之间的共享会话,以便当RP调用WCF服务时,WCF可以重新利用为RP发出的身份验证cookie。说实话,我从未尝试过实施这一点。这只是我的理论。
  2. 创建单独的身份验证服务,无需用户交互(例如输入用户名/密码)。然后你有足够的方法从你的RP调用WCF:
    • 从您的RP,请求身份验证服务为WCF颁发令牌;将令牌附加到WCF呼叫的请求头中(例如:授权);然后调用WCF服务。这需要一个自定义HttpModule来接受包含WCF服务令牌的自定义请求头。
    • 您可以在RP中存储用户名/密码,或者可以识别用户的唯一用户身份声明;将这些信息附加到WCF呼叫的请求头中(例如:授权);然后调用WCF服务。这还需要自定义HttpModule接受WCF服务的自定义请求标头。
  3. 我建议使用第二个选项,您可以从Dominick Baier's blog找到更多有用的信息和指南。

    只需2美分。