我创建了一个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) 我正在编写.Net中的客户端应用程序,它通过HTTP与服务器通信.
在NTLM和Kerberos授权的情况下,我需要设置不同的请求缓冲选项.
如何确定是否使用NTLM或Kerberos?有可能以某种方式解码'WWW-Authenticate:Negotiate'标题?
要在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邮件列表上再次存在.
在搜索Windows身份验证方法和协议之后,我决定在使用IIS和Web身份验证之前了解简单可执行文件中使用的Negotiate,Kerberos和NTLM之间的确切区别.
我达到了很好的效果,但我还需要有关Negotiate和Kerberos的更多细节.
我有以下场景:
我创建了非常简单的C#窗体表单应用程序,它显示了一个消息框显示的值:
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType
Run Code Online (Sandbox Code Playgroud)
请注意,我是在本地计算机上具有管理员权限的域用户,我有以下结果:
当我在主动连接到DC时运行exe文件(双击)时,我得到了"Negotiate".
当我运行exe文件(作为varynet用户/使用本地用户运行),而我主动连接到DC时,我得到了"NTLM".
当我使用"以管理员身份运行"或"以不同用户身份运行"运行exe文件时,我得到了"Kerberos".
当我使用本地帐户本地登录时运行exe文件时,我得到了"NTLM".
我知道LSA会将NTLM用于本地帐户.另外我知道Active Directory使用Kerberos来验证域用户和计算机.
我的问题是,当我使用我的帐户(双击)或使用我的同一帐户"以不同用户身份运行"运行exe时,为什么我会获得协商身份验证类型?
更新:我注意到以下内容:
- 如果本地用户正在运行exe,那么它是NTLM
- 如果域用户运行exe然后它是Negotiate(如果该用户是本地管理员)但是是Kerberos(如果该用户不是本地管理员) )
- 如果域管理员运行exe,那么它是Kerberos
我只是澄清了这种行为.
ntlm kerberos windows-authentication windows-security negotiate
我有一个web应用程序,它也执行kerberos和基本身份验证.我不知道客户端的能力.因此,两个身份验证机制都在401回复中发送.
回复标题将包含,
WWW-Authenticate: Negotiate
WWW-Authenticate: Basic realm="MyREALM"
Run Code Online (Sandbox Code Playgroud)
但是,我希望客户端只有在协商失败时才能回退到基本身份验证.
我希望流程应该像,
我怎样才能做到这一点?我修改了服务器代码来执行此操作.但是不在任何域中的浏览器(它应该做基本身份验证)在步骤2之后没有响应.
微软利用我目前所知的两个WWW-Authenticate新增功能
如果从服务器发送Negotiate,则基于一组条件将使用Kerberos
然后将在服务器和客户端之间尝试Kerberos,如果不满足上述条件,则将尝试NTLM.
我的问题是,是否有一些方法让服务器指示不应该发送NTLM?我目前通过跟踪会话中的请求来处理这个问题,如果收到NTLM消息,它会在其余的会话生命周期中禁用Kerberos和WWW-Authenticate.
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) 我按照本指南将 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) 我们最近更新了 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/1.1:
当切换到新选项卡时,浏览器直接使用 http/2 进行所有请求,因为身份验证过程是通过会话 cookie 完成的:
对于这种行为有什么合理的解释吗?我如何建议(强制)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
有关设置的一些上下文:
我们正在从NTLM切换到Kerberos(协商),以在各种.NET工作负载(例如IIS托管的Web API或简单的.NET命令行程序)之间进行服务到服务的身份验证。
对于从客户端到服务器的任何调用,中间都有一个API网关。我们在网关中有一些自定义逻辑,用于执行身份验证和强制执行Kerberos(使用NTLM票证拒绝协商标头)。正常的客户端-服务器流如下所示:
现在,为了不做大的改变,我们能够(在网关中)基于来自(C)的请求的原始目的地(应该是大致的主机名)配置发生Kerberos检查的请求和(S)的端口。
此设置可以正常工作,但偶尔会出现一个难以复制的问题:
klist get HTTP/spn-of-G
,即使冒充完全相同的用户,也可以从(C)执行a 并接收正确的Kerberos票证(C)通常以我的问题是:是否有其他可能的方法可以解决这种情况,而无需重新启动服务器?
我已经尝试过但没有成功的事情:
iisreset
。但是我已经看到了这个问题,例如(C)是每15分钟运行一次完成的C#命令行程序。ipconfig /flushdns
klist purge
使用powershell脚本对所有登录会话执行)很抱歉就这个主题做另一个问题,但我一直在阅读,但无法真正让它发挥作用......
切入正题...我有一个可以下载 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