C# 在独立应用程序上使用ADFS进行windows身份验证

C# 在独立应用程序上使用ADFS进行windows身份验证,c#,windows-authentication,adfs,C#,Windows Authentication,Adfs,我有一个Windows控制台应用程序,它试图对ADF执行Windows身份验证。我已经能够使用用户名/密码进行身份验证,但我不想这样做,因为该用户已经在Windows中进行了身份验证 我有以下代码: //Setup the connection to ADFS const string adfsEndpoint = "https://iis.dev.lab/adfs/services/trust/13/windowsmixed"; var fa

我有一个Windows控制台应用程序,它试图对ADF执行Windows身份验证。我已经能够使用用户名/密码进行身份验证,但我不想这样做,因为该用户已经在Windows中进行了身份验证

我有以下代码:

        //Setup the connection to ADFS

        const string adfsEndpoint = "https://iis.dev.lab/adfs/services/trust/13/windowsmixed";

        var factory = new WSTrustChannelFactory(new WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(adfsEndpoint))
        {
            TrustVersion = TrustVersion.WSTrust13
        };

        //Setup the request object 
        var rst = new RequestSecurityToken
        {
            RequestType = RequestTypes.Issue,
            KeyType = KeyTypes.Bearer,
            AppliesTo = new EndpointReference(relyingPartyId)
        };

        //Open a connection to ADFS and get a token for the logged in user
        var channel = factory.CreateChannel();

        var genericToken = channel.Issue(rst) as GenericXmlSecurityToken;
当它试图获取令牌时,我有一个异常:

安全支持提供程序接口SSPI身份验证失败。ser 版本可能未在标识为“host/iis.dev.lab”的帐户中运行。如果se 服务器正在服务帐户网络服务中运行。例如,请指定 帐户的ServicePrincipalName作为se的EndpointAddress中的标识 服务器。如果服务器在用户帐户中运行,请指定帐户的UserPrin cipalName作为服务器端点地址中的标识

问题是:

用户已在dev.lab域中通过身份验证 ADSF服务正在dev.lab域中的管理员用户帐户下运行 在错误消息中,由于某种原因,我拥有iis.dev.lab域,这可能就是原因。。 问题:

我是否应该使用此url../adfs/services/trust/13/windowsmixed来执行这种身份验证?还是应该使用kerberosmixed?有人能指出一些关于ADFS中每个可用服务目标的文档吗? 在发出请求之前,是否有办法设置用户的域?我尝试了这个factory.Credentials.Windows.ClientCredential.Domain=dev.lab;但是没有成功。 即使执行win auth,我是否仍需要定义凭据?例如:factory.Credentials.Windows.ClientCredential=CredentialCache.DefaultNetworkCredentials?
非常感谢您的帮助。

因此,出现此错误消息的原因可能是您的ADF配置不正确

请在此处查看SPN的定义:

要解决此问题,您需要在ADFS服务帐户或服务器本身上设置SPN

SETSPN-HTTP/{ADFS服务器的URL}域名/服务名

SETSPN-HTTP/{ADFS服务器的URL}计算机名

然后重新启动ADFS服务。关于服务帐户的一个注意事项是,如果您使用网络或系统帐户运行,那么您仍然需要使用计算机名,因为这些是本地服务器帐户。例如,如果ADFS url为iis.dev.lab,则执行以下操作:

SETSPN-HTTP/IIS.DEV.LAB ADFSServer


另外-要测试您的adfs设置:

因此,出现此错误消息的可能原因是您的adfs配置不正确

请在此处查看SPN的定义:

要解决此问题,您需要在ADFS服务帐户或服务器本身上设置SPN

SETSPN-HTTP/{ADFS服务器的URL}域名/服务名

SETSPN-HTTP/{ADFS服务器的URL}计算机名

然后重新启动ADFS服务。关于服务帐户的一个注意事项是,如果您使用网络或系统帐户运行,那么您仍然需要使用计算机名,因为这些是本地服务器帐户。例如,如果ADFS url为iis.dev.lab,则执行以下操作:

SETSPN-HTTP/IIS.DEV.LAB ADFSServer


另外-为了测试您的adfs设置:

在我寻找同一问题的答案时,我只是简单地回答了这个问题

我只是通过以下方法解决了我的问题:

        EndpointIdentity identity = new SpnEndpointIdentity("your spn");

        //Setup the connection to ADFS
        var factory = new WSTrustChannelFactory(new WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(new Uri(adfsEndpoint), identity))
        {
            TrustVersion = TrustVersion.WSTrust13
        };

请注意,端点地址现在是一个URI,我将沿着我的服务帐户的spn标识进行解析。

在我寻找同一问题的答案时,我刚刚解决了这个问题

我只是通过以下方法解决了我的问题:

        EndpointIdentity identity = new SpnEndpointIdentity("your spn");

        //Setup the connection to ADFS
        var factory = new WSTrustChannelFactory(new WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(new Uri(adfsEndpoint), identity))
        {
            TrustVersion = TrustVersion.WSTrust13
        };

请注意,端点地址现在是一个URI,我将沿着我的服务帐户的spn标识进行解析。

除非您的域启用了kerberos,否则您将希望使用windows端点。除非您的域启用了kerberos,否则您将希望使用windows端点。我已经这样做了,但我必须缺少一些内容,因为在我安装了ADFS的计算机中应用程序可以工作,但在同一域中使用相同凭据连接的另一台计算机上,我仍然有上面的错误消息。我已经这样做了,但我必须缺少一些内容,因为在安装了ADFS的计算机上,我的应用程序可以工作,但是,在同一域中的另一台计算机上,使用相同的凭据连接时,我仍然会收到上面的错误消息。投票通过此选项,因为它会引导我找到我的情况下的解决方案-以及Travis Sharp的回答投票通过此选项,因为它会引导我找到我的情况下的解决方案-以及Travis Sharp的回答