我有这个Windows控制台应用程序,它正在尝试对ADFS执行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)身份验证失败。服务
  ver可能未在标识为“ host / iis.dev.lab”的帐户中运行。如果se
  rver在服务帐户(例如网络服务)中运行,请指定
  帐户的ServicePrincipalName作为其在EndpointAddress中的标识
  rver。如果服务器以用户帐户运行,请指定该帐户的UserPrin
  cipalName作为服务器的EndpointAddress中的标识。


事情是:


用户已在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;吗?


任何帮助表示赞赏。

最佳答案

因此,此错误消息的“可能”原因是您可能配置了错误的ADFS。

在此处查找SPN的定义:https://msdn.microsoft.com/en-us/library/ms677949(v=vs.85).aspx

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

SETSPN -a HTTP / {ADFS服务器的URL} DOMAIN / SERVICENAME

SETSPN -a HTTP / {ADFS服务器的URL} COMPUTERNAME

然后重新启动ADFS服务。关于服务帐户的一项说明,如果您正在使用网络或系统帐户运行,则仍将需要使用计算机名称,因为这些名称是本地服务器帐户。例如,如果您具有iis.dev.lab的ADFS网址,则可以执行以下操作:

SETSPN-一个HTTP / IIS.DEV.LAB ADFSServer

另外-要测试您的adfs设置:https://iis.dev.lab/adfs/ls/IdpInitiatedSignon.aspx

关于c# - 在独立应用程序上使用ADFS进行Windows身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32615043/

10-12 07:18