标签: negotiate

WCFTestClient HTTP请求未经授权,客户端身份验证方案为"匿名"

我创建了一个WCF服务并将其部署在Server上.当我浏览这个服务时,它使用?wsdl URL给出了积极的回应.现在我正试图通过WCF测试客户端测试服务.它显示正确的元数据.但是当我尝试从服务中调用任何方法时,它会向我显示异常...这里是堆栈跟踪的错误细节.

HTTP请求未经授权,客户端身份验证方案为"匿名".从服务器收到的身份验证标头是"Negotiate,NTLM".

服务器堆栈跟踪:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,HttpChannelFactory factory)
HTTP请求未经授权使用客户端身份验证方案"Anonymous".从服务器收到的身份验证标头是"Negotiate,NTLM".

服务器堆栈跟踪:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,HttpChannelFactory工厂)

客户端绑定:

<bindings>
    <wsHttpBinding>
        <binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
            allowCookies="false">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <reliableSession ordered="true" inactivityTimeout="00:10:00"
                enabled="false" />
            <security mode="None">
                <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    establishSecurityContext="true" />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)

服务器绑定:

<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="900000" …
Run Code Online (Sandbox Code Playgroud)

wcf ntlm anonymous wcftestclient negotiate

63
推荐指数
5
解决办法
24万
查看次数

如何从WWW-Authenticate:Negotiate标头中查找是否使用NTLM或Kerberos

我正在编写.Net中的客户端应用程序,它通过HTTP与服务器通信.

在NTLM和Kerberos授权的情况下,我需要设置不同的请求缓冲选项.

如何确定是否使用NTLM或Kerberos?有可能以某种方式解码'WWW-Authenticate:Negotiate'标题?

.net ntlm kerberos www-authenticate negotiate

21
推荐指数
2
解决办法
3万
查看次数

人们如何让Java SPNEGO客户端在Windows中运行?

要在Windows上使用Java进行客户端HTTP SPNEGO身份验证,您需要设置Windows注册表项allowtgtsessionkey.这是有据可查的.我不明白的是人们如何解决这个问题?为了单个软件,大多数企业站点永远不会接受在Windows中更改此注册表项.如果需要在组织中的每个工作站上更改它,请考虑一下麻烦.但这只是理论,因为我到目前为止还无法说服我们的任何客户更改此注册表项.

我不怪他们.大多数企业管理员会认为这样可以放松安全性并因此反对它.

我已经读过: 在Java或命令行工具中是否有办法使用本机SSPI API获取服务的Kerberos票证?

但它现在已经很老了.

所以我真的,真的不明白人们如何使Windows + Java客户端+ Kerberos可以在除大学环境,家庭用户等之外的任何地方工作.

我从公司管理员那里得到的问题是"当IE和Firefox等应用程序在没有设置此密钥的情况下执行SPNEGO时没有问题时,我们为什么需要设置此注册表项?".好吧,我知道答案是什么.这是因为(很可能)IE和Firefox等应用程序基于Windows本机GSS API(SSPI),而Sun的Java使用自己的实现.

我假设使用像WAFFLE这样的东西可以解决问题,但我赞成纯Java解决方案.我还假设使用基于Java的解决方案(如Spring安全性或Apache HttpClient)无济于事,因为它们都会遇到这个问题.

任何帮助或指针将不胜感激.

更新1:

我发现Oracle的bug数据库中有一个RFE.还有一个由Oracle员工就此问题提交补丁以及有关此功能的JDK邮件列表的讨论.除了我能理解的这一点在目前的Java 7中是不可用的,甚至不是实验性的,都不会让我更加明智.对?

更新2:

现在问题在OpenJDK Security Dev邮件列表上再次存在.

java sspi spnego gssapi negotiate

16
推荐指数
1
解决办法
7361
查看次数

Windows可执行文件身份验证

在搜索Windows身份验证方法和协议之后,我决定在使用IIS和Web身份验证之前了解简单可执行文件中使用的Negotiate,Kerberos和NTLM之间的确切区别.

我达到了很好的效果,但我还需要有关Negotiate和Kerberos的更多细节.

我有以下场景:

我创建了非常简单的C#窗体表单应用程序,它显示了一个消息框显示的值:

System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType
Run Code Online (Sandbox Code Playgroud)

请注意,我是在本地计算机上具有管理员权限的域用户,我有以下结果:

  1. 当我在主动连接到DC时运行exe文件(双击)时,我得到了"Negotiate".

  2. 当我运行exe文件(作为varynet用户/使用本地用户运行),而我主动连接到DC时,我得到了"NTLM".

  3. 当我使用"以管理员身份运行"或"以不同用户身份运行"运行exe文件时,我得到了"Kerberos".

  4. 当我使用本地帐户本地登录时运行exe文件时,我得到了"NTLM".

我知道LSA会将NTLM用于本地帐户.另外我知道Active Directory使用Kerberos来验证域用户和计算机.

我的问题是,当我使用我的帐户(双击)或使用我的同一帐户"以不同用户身份运行"运行exe时,为什么我会获得协商身份验证类型?

更新:我注意到以下内容:

- 如果本地用户正在运行exe,那么它是NTLM
- 如果域用户运行exe然后它是Negotiate(如果该用户是本地管理员)但是是Kerberos(如果该用户不是本地管理员) )
- 如果域管理员运行exe,那么它是Kerberos

我只是澄清了这种行为.

ntlm kerberos windows-authentication windows-security negotiate

8
推荐指数
1
解决办法
825
查看次数

如何在Negotiate失败时从Negotiate方法回退到Basic

我有一个web应用程序,它也执行kerberos和基本身份验证.我不知道客户端的能力.因此,两个身份验证机制都在401回复中发送.

回复标题将包含,

WWW-Authenticate: Negotiate
WWW-Authenticate: Basic realm="MyREALM"
Run Code Online (Sandbox Code Playgroud)

但是,我希望客户端只有在协商失败时才能回退到基本身份验证.

我希望流程应该像,

  1. 客户请求
  2. 服务器响应WWW-Authenticate:Negotiate
  3. 客户端重新请求(具有错误的身份验证数据或带有一些标志,指示无法继续)
  4. 服务器响应再次使用WWW-Authenticate:Basic realm ="MYREALM"
  5. 客户端执行基本身份验证.

我怎样才能做到这一点?我修改了服务器代码来执行此操作.但是不在任何域中的浏览器(它应该做基本身份验证)在步骤2之后没有响应.

browser authentication http basic-authentication negotiate

7
推荐指数
1
解决办法
1389
查看次数

我可以向客户表明支持SPNEGO但NTLM不支持HTTP请求吗?

微软利用我目前所知的两个WWW-Authenticate新增功能

  • NTLM
  • 谈判

如果从服务器发送Negotiate,则基于一组条件将使用Kerberos

  • 内联网区域
  • 使用主机名而不是IP访问服务器
  • IE中的集成Windows身份验证已启用,主机在Firefox中受信任
  • 服务器不是浏览器的本地服务器
  • 客户端的Kerberos系统通过域控制器进行身份验证

然后将在服务器和客户端之间尝试Kerberos,如果不满足上述条件,则将尝试NTLM.

我的问题是,是否有一些方法让服务器指示不应该发送NTLM?我目前通过跟踪会话中的请求来处理这个问题,如果收到NTLM消息,它会在其余的会话生命周期中禁用Kerberos和WWW-Authenticate.

ntlm kerberos spnego www-authenticate negotiate

6
推荐指数
1
解决办法
8786
查看次数

How to get NegotiateStream to use Kerberos?

After asking this question, I've been trying to use NegotiateStream to authenticate a Windows client against a Java server. It seems that Java doesn't have great NTLM library support, so I've been working on the assumption that I'd have to use Kerberos, which Java seems to support much better (via the GSS-API).

问题是 NegotiateStream 似乎每次都尝试使用 NTLM。文档表明它可以使用任何一种,但没有指定它如何选择。我在 API 中看不到任何选项来控制它选择哪种机制。有办法吗?

我有自己的服务主体名称,我的客户端代码如下所示:

string spn = "<service-name>/<my-pc-name>"
TcpClient client = new TcpClient(server, port);
NetworkStream stream = client.GetStream();
NegotiateStream neg = new NegotiateStream(stream, true); …
Run Code Online (Sandbox Code Playgroud)

authentication negotiate

5
推荐指数
1
解决办法
2404
查看次数

Kerberos 授权不适用于 Chrome 和 FireFox,但适用于 IE

我按照本指南将 cas 与 Windows AD 集成。

几天前,它在每个浏览器上都运行良好。但它不仅仅适用于IE,当我使用firefox浏览器时,仅发送“Negotiate TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==”到服务器,然后浏览器返回到cas登录页面。

最近才在生产环境中发现这个问题。我有一个具有相同配置的测试环境,但到目前为止它运行良好。

我知道当 kerberos 票证未缓存在本地时,浏览器将发送“协商 TlRMT...”。但我可以用 klist 命令看到票证,并且它在 IE 上工作意味着票证没问题。

我想这可能是由 Windows 客户端或广告服务器的某些配置引起的,任何人都可以给我一些建议,tks!

https://1056-app.test.com ” 已添加到 Firefox 上的“network.negotiate-auth.trusted-uris”。我也尝试过重新安装firefox,还是不行。

铬:55

IE:11

火狐:56

Clinet浏览器操作系统:Windows 7

AD服务器操作系统:Windows Server 2008 R2

Cas服务器操作系统:Suse11Sp3

这是 FireFox 上的 http 转储

GET https://1056-app.test.com/cas/login 401 Unauthorized

Response Headers
Server : nginx/1.8.0
Date : Fri, 13 Oct 2017 10:38:08 GMT
Content-Type : text/html;charset=UTF-8
Transfer-Encoding : chunked
Connection : keep-alive
Pragma : no-cache
Expires : Thu, 01 Jan 1970 00:00:00 GMT …
Run Code Online (Sandbox Code Playgroud)

firefox google-chrome kerberos spnego negotiate

5
推荐指数
1
解决办法
1万
查看次数

Kerberos 通过 http/2 协商后,MS IE 和 Edge 回退到 http/1.1

我们最近更新了 Apache (v 2.4.33) 反向代理以使用 http/2

Win 10E 1709 上的 MS IE (v 11.431.16299.0) 和 MS Edge (v 41.16299.402.0) 似乎在第一个请求后回退到 http/1.1。两个浏览器都会坚持使用 http/1.1,即使在完全刷新并清除缓存后也不会更改为 http/2。

第一个请求(没有 Kerberos 协商身份验证标头)http/2: 第一个请求 http/2 其余的 http/1.1

第二个请求(带有协商标头)以及所有其他请求都是 http/1.1: 带有 auth 标头的第二个请求

当切换到新选项卡时,浏览器直接使用 http/2 进行所有请求,因为身份验证过程是通过会话 cookie 完成的: http/2 在新选项卡中工作

对于这种行为有什么合理的解释吗?我如何建议(强制)IE/Edge 继续使用 http/2?

Kerberos 协商在这里很容易解释: https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/47 /48/8468.4.png

https kerberos negotiate http2 kerberos-delegation

5
推荐指数
1
解决办法
661
查看次数

在启用Kerberos之后,客户端有时会协商NTLM,直到重新启动客户端服务器为止。如何避免重启?

有关设置的一些上下文:

我们正在从NTLM切换到Kerberos(协商),以在各种.NET工作负载(例如IIS托管的Web API或简单的.NET命令行程序)之间进行服务到服务的身份验证。

对于从客户端到服务器的任何调用,中间都有一个API网关。我们在网关中有一些自定义逻辑,用于执行身份验证和强制执行Kerberos(使用NTLM票证拒绝协商标头)。正常的客户端-服务器流如下所示:

  1. 客户端(C)向服务器(S)发送请求
  2. 网关(G)拦截请求
  3. (G)使用WWW身份验证返回401挑战:协商
  4. (C)再次发送请求,并带有一个Authorization:Negotiate [ticket]标头
  5. (G)检查[ticket]并:
    5.a如果[ticket]为NTLM:“拒绝”请求(返回非成功状态码)
    5.b如果[ticket]为Kerberos:验证票证并(如果有效)通过请求到(S)

现在,为了不做大的改变,我们能够(在网关中)基于来自(C)的请求的原始目的地(应该是大致的主机名)配置发生Kerberos检查的请求和(S)的端口。

此设置可以正常工作,但偶尔会出现一个难以复制的问题:

  • 有时候,对于某些(S),当我们在(G)中启用Kerberos检入时,客户端(C)会继续发送NTLM票证(因此被拒绝)。
  • 尽管存在这样的事实,即(C)能够与Kerberos对话(G)的所有先决条件都得到满足-例如klist get HTTP/spn-of-G,即使冒充完全相同的用户,也可以从(C)执行a 并接收正确的Kerberos票证(C)通常以
  • 最重要的是,在与(C)相同的服务器上经常会有其他应用程序经过相同的流程
  • 重新启动运行(C)的Windows Server实例可以解决此问题,从而使(C)在重新启动后向(G)发送适当的Kerberos票证

我的问题是:是否有其他可能的方法可以解决这种情况,而无需重新启动服务器

我已经尝试过但没有成功的事情:

  • 重新启动在(C)上运行的应用程序。如果(C)是IIS应用程序,我尝试重新启动应用程序池,或者iisreset。但是我已经看到了这个问题,例如(C)是每15分钟运行一次完成的C#命令行程序。
  • 在运行(C)的服务器上刷新DNS ipconfig /flushdns
  • 在运行(C)的服务器上清除所有缓存的Kerberos票证(klist purge使用powershell脚本对所有登录会话执行)

.net windows kerberos negotiate ntlm-authentication

5
推荐指数
0
解决办法
81
查看次数

C# HTTPWebRequest 与领域站点协商/基本

很抱歉就这个主题做另一个问题,但我一直在阅读,但无法真正让它发挥作用......

切入正题...我有一个可以下载 zip 文件的链接。我已获得访问该网站(我的用户)的权限,现在我正在尝试编写一个程序来每隔一段时间获取 zip.file,以便我可以对其数据进行处理。

当我刚刚尝试下载需要身份验证的东西的代码时(见下面的代码),我得到一个 HTTP 401。我想知道为什么我的凭据没问题,我可以使用浏览器获取文件。

HttpWebRequest request;
HttpWebResponse response;

request = (HttpWebRequest)WebRequest.Create(strURL);

request.Credentials = ((domain == null || domain == "") ?
                new System.Net.NetworkCredential(user, pass) :
                new System.Net.NetworkCredential(user, pass, domain)));

response = (HttpWebResponse)request.GetResponse();
//...do somthing
Run Code Online (Sandbox Code Playgroud)

在阅读和搜索后,我得出的结论是我必须明确告诉身份验证者。方法并找到了 CredentialCache 示例。我之后做的是打开 fiddler 并查看网站的响应并找到以下标题:

WWW-Authenticate: Negotiate
WWW-Authenticate: Basic realm="BACKLOG ::::::: AUTENTICACAO NECESSARIA - USAR APENAS USERNAME E PASSWORD DE DOMINIO"
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以知道什么是 auth. 我需要输入,所以我将代码更改为以下内容:

HttpWebRequest request;
HttpWebResponse response;

request = (HttpWebRequest)WebRequest.Create(strURL);

CredentialCache cc = new CredentialCache();
cc.Add(new Uri(strURL), "Negotiate", (
                (domain == …
Run Code Online (Sandbox Code Playgroud)

c# authentication httprequest basic-authentication negotiate

3
推荐指数
1
解决办法
5955
查看次数