我有这个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/