【发布时间】:2014-02-24 22:13:27
【问题描述】:
我有一个通过 ADFS 进行身份验证的 Web 应用程序和 Web api 服务。它们包含在同一个 IIS 应用程序中,Web 应用程序可以毫无问题地回调 Web api 服务。
我现在正尝试从不同的应用程序调用相同的服务,但在传递令牌时遇到了问题。我可以使用以下代码验证和检索 SAML 令牌:
var stsEndpoint = "https://MyAdfsServer/adfs/services/trust/13/UsernameMixed";
var reliantPartyUri = "https://MyDomain/AppRoot/";
var factory = new Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
new EndpointAddress(stsEndpoint));
factory.TrustVersion = System.ServiceModel.Security.TrustVersion.WSTrust13;
// Username and Password here...
factory.Credentials.UserName.UserName = @"Domain\UserName";
factory.Credentials.UserName.Password = "Password";
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
AppliesTo = new EndpointAddress(reliantPartyUri),
KeyType = KeyTypes.Bearer,
};
var channel = factory.CreateChannel();
var token = channel.Issue(rst) as GenericXmlSecurityToken;
var saml = token.TokenXml.OuterXml;
但是,我不确定如何将 saml 传递给 web api 调用。我试过这个:
using (var handler = new HttpClientHandler()
{
ClientCertificateOptions = ClientCertificateOption.Automatic,
AllowAutoRedirect = false
})
{
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("https://MyDomain/AppRoot/api/");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("SAML", saml);
HttpResponseMessage response = client.GetAsync("MyService/Get/").Result;
// Get the results...
var result = response.Content.ReadAsStringAsync().Result;
var status = response.StatusCode;
}
}
这将返回状态代码 302 并尝试将我重定向到 ADFS 服务器进行身份验证。还有其他方法可以将 SAML 令牌传递给 Web api 服务吗?
【问题讨论】:
-
SAML 令牌和 REST API 不能很好地配合使用。考虑使用 OAuth 2.0。
-
我也有同样的问题,因为我有 Windows Server 2008 R2 并且 Oauth 2.0 不可用,你设法做到了吗?
-
不,我们最终创建了一个单独的 IIS 应用程序,该应用程序通过 Windows Auth 进行身份验证以公开所需的服务。不是最好的解决方案,但它符合我们的需求。
标签: c# asp.net-web-api saml adfs