【问题标题】:windows authentication with ADFS on standalone application在独立应用程序上使用 ADFS 进行 Windows 身份验证
【发布时间】:2015-12-13 10:05:27
【问题描述】:

我有这个 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”的帐户中运行。如果这些 rver 在服务帐户(例如网络服务)中运行,请指定 帐户的 ServicePrincipalName 作为 SE 的 EndpointAddress 中的标识 河。如果服务器在用户帐户中运行,请指定该帐户的 UserPrin cipalName 作为服务器的 EndpointAddress 中的标识。

事情是这样的:

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

问题:

  1. 我应该使用这个 url ("../adfs/services/trust/13/windowsmixed") 来执行这种身份验证吗?或者我应该使用 kerberosmixed 吗?有人可以指出一些有关 ADFS 中可用服务的目标的文档吗?
  2. 有没有办法在发出请求之前设置用户的域?我试过这个factory.Credentials.Windows.ClientCredential.Domain = "dev.lab";,但没有成功。
  3. 即使进行 win auth,我还需要定义凭据吗?比如这样:factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;?

感谢任何帮助。

【问题讨论】:

  • 除非您的域启用了 kerberos,否则您将需要使用 windows 端点。

标签: c# windows-authentication adfs


【解决方案1】:

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

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

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

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

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

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

SETSPN -a HTTP/IIS.DEV.LAB ADFSServer

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

【讨论】:

  • 我已经完成了,但我一定遗漏了一些东西,因为在我安装了 ADFS 的机器上我的应用程序可以工作,但在同一域中的另一台机器上使用相同的凭据连接我仍然有错误上面的消息。
【解决方案2】:

我在寻找同一问题的答案时偶然发现了这个问题。

我刚刚通过执行以下操作解决了我的问题:

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

【讨论】:

  • 对此表示赞同,因为它引导我找到适合我的情况的解决方案 - 以及 Travis Sharp 的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多