2015-09-16 37 views
1

我有此Windows控制台应用程序试图针对ADFS执行Windows身份验证。我已经能够使用用户名/密码进行身份验证,但我不想这样做,因为用户已经在Windows中进行身份验证。在独立应用程序上使用ADFS进行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 rver正在服务帐户(例如,网络服务)中运行,请指定 帐户的ServicePrincipalName作为se rver的EndpointAddress中的标识。如果服务器在用户帐户中运行,请将该帐户的UserPrin cipalName指定为该服务器的EndpointAddress中的标识。

的事情是:

  • 用户已经通过身份验证的dev.lab
  • ADSF服务管理员用户帐户下运行在dev.lab
  • 在错误消息中我有域名iis.dev.lab由于某种原因,可能是原因..

问题:

  1. 我应该使用这个网址( “../adfs/services/trust/13/ windowsmixed”)来执行这种认证的?或者我应该使用kerberosmixed?有人可以指出一些关于ADFS中可用服务目标的文档吗?
  2. 有没有办法在提出请求之前设置用户的域名?我试过这个factory.Credentials.Windows.ClientCredential.Domain = "dev.lab";但它没有解决。
  3. 即使进行auth验证,我是否还需要定义凭据?像这样的例子:factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;

任何帮助表示赞赏。

+0

除非您的域名已启用Kerberos,否则您将需要使用Windows端点。 –

回答

3

因此,此错误消息的“可能”原因是您可能有ADFS配置不正确。

在这里寻找一个SPN的定义:https://msdn.microsoft.com/en-us/library/ms677949(v=vs.85).aspx

要解决这一点,你要么需要在ADFS服务帐户或服务器本身设置SPN。

SETSPN -A HTTP/DOMAIN/SERVICENAME

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

,然后重新启动ADFS服务{THE ADFS服务器的URL}。关于服务帐户的一个注意事项是,如果您正在使用网络或系统帐户运行,那么您仍然需要使用计算机名称,因为这些帐户是本地服务器帐户。例如,如果你有iis.dev.lab的ADFS网址,然后你这样做:

SETSPN -A HTTP/IIS.DEV.LAB ADFSServer

而且 - 测试您的ADFS设置:https://iis.dev.lab/adfs/ls/IdpInitiatedSignon.aspx

+0

我已经这样做了,但是我必须缺少一些东西,因为在安装了ADFS的机器上,我的应用程序可以正常工作,但在同一个域中的另一台机器上,使用相同的凭据连接,我仍然有上面的错误消息。 – user2457870

0

当我正在寻找同一问题的答案时,只是st across了这个问题。

我勉强做来解决我的问题如下:

 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身份解析。

相关问题