带SSO的自托管WCF服务器
本文关键字:WCF 服务器 SSO | 更新日期: 2023-09-27 18:16:01
我们有一个自托管的WCF服务,通过HTTP托管内容,并希望能够支持Windows/AD的单点登录。理想情况下,它将支持IE, Firefox和Chrome。
我构建了以下示例服务,它通过HTTP返回一些纯文本。注意:在生产版本中,我们使用SSL,但我在下面关闭了SSL,以使运行示例不那么挑剔。
我们将HttpSecurityMode设置为TransportCredentialOnly,然后将ClientCredentialType设置为HttpClientCredentialType。Windows,我相信它会使用Kerberos。
如果我使用"NTLM"而不是"Windows",它似乎确实有效,但我收集到使用NTLM是不建议的,如果我们有一个反向代理坐在我们的服务前面,它会崩溃。
当我们运行以下代码并在IE 10中连接时,我们得到提示输入我们的Windows凭据,但在输入这些凭据后,我们只得到一个HTTP 400,我没有在我的"get"方法中遇到任何断点。理想情况下,我们应该看到一个回复说"你好,[域'用户]!",但我们没有做到这一点。
我们的测试机器(客户端和服务器)都是同一个Windows域的一部分。我运行的服务作为一个本地管理员,但不是域管理员(如果这将是重要的)。
我们将感谢任何帮助!
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;
using System.Text;
namespace WindowsAuthService
{
[ServiceContract]
public interface ITestService
{
[OperationContract]
[WebGet(UriTemplate = "{*path}")]
Stream Get(string path);
}
public class TestService : ITestService
{
public Stream Get(string path)
{
WebOperationContext.Current.OutgoingResponse.Headers.Add(HttpResponseHeader.ContentType, "text/plain");
if (OperationContext.Current.ServiceSecurityContext == null)
return new MemoryStream(Encoding.ASCII.GetBytes(String.Format("Hello, {0}!", "Anonymous Stranger")));
else
return new MemoryStream(Encoding.ASCII.GetBytes(String.Format("Hello, {0}!", OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name)));
}
}
class Program
{
private const string URL = "http://mymachine.mydomain:7777";
static void Main(string[] args)
{
WebServiceHost serviceHost = new WebServiceHost(new TestService());
foreach (IServiceBehavior attr in serviceHost.Description.Behaviors)
{
if (attr is ServiceBehaviorAttribute)
{
ServiceBehaviorAttribute serviceAttr = (ServiceBehaviorAttribute)attr;
serviceAttr.InstanceContextMode = InstanceContextMode.Single;
serviceAttr.ConcurrencyMode = ConcurrencyMode.Multiple;
}
}
WebHttpBinding binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
ServiceEndpoint serviceEndpoint = serviceHost.AddServiceEndpoint(typeof (ITestService), binding, URL);
serviceEndpoint.Behaviors.Add(new WebHttpBehavior());
Console.WriteLine("Service Listening @ " + URL);
serviceHost.Open();
Console.WriteLine("[ Press Enter to Quit ]");
Console.ReadLine();
}
}
}
您已经获得了工作代码。我猜你有个代理人。是,在IE 10中,进入"工具> Internet选项>连接(页签)>局域网设置"。在对话框中,检查旁路代理服务器的本地地址。
此外,您可以转到安全选项卡>本地内部网>单击站点按钮并选择自动检测本地内部网-您不会提示凭据- IE 10将发送登录用户的凭据。