【问题标题】:NTLM authorization WCF in ASP.NET Core does not workASP.NET Core 中的 NTLM 授权 WCF 不起作用
【发布时间】:2016-11-22 11:51:57
【问题描述】:

我遇到了 NTLM 授权问题 我有在asp.net上运行的服务没有任何问题,但现在我需要在asp.net核心上使用这个服务,我无法通过授权。

我这样配置绑定:

        var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
        binding.OpenTimeout = binding.CloseTimeout = 
        binding.SendTimeout = binding.ReceiveTimeout = TimeSpan.FromMinutes(1);
        binding.MaxReceivedMessageSize = 20971520;
        binding.MaxBufferPoolSize = binding.MaxBufferSize = 20971520;
        binding.ReaderQuotas.MaxArrayLength =
        binding.ReaderQuotas.MaxStringContentLength =
        binding.ReaderQuotas.MaxBytesPerRead =
        binding.ReaderQuotas.MaxNameTableCharCount = 2097152;

        binding.TextEncoding = Encoding.UTF8;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
        //binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
        binding.TransferMode = TransferMode.Buffered;
        binding.AllowCookies = false;

然后添加

        ClientCredentials.Windows.ClientCredential.UserName = service.Login;
        ClientCredentials.Windows.ClientCredential.Password = service.Password;

然后我请求服务并获取

---> System.ServiceModel.Security.MessageSecurityException:HTTP 请求未经客户端身份验证方案“Ntlm”的授权。这 从服务器收到的身份验证标头是“NTLM”。

我打开 fiddler 并比较了两个请求(asp.net 和 core) 而且我发现授权标头有所不同,但配置文件中的密码和登录名相同。

ASP.NET:

授权:NTLM TlRMTVNTUAABAAAAB4IYogAAAAAAAAAAAAAAAAAAAAAAKADk4AAAADw==

核心:

授权:NTLM TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAAKADk4AAAADw==

我尝试编写自定义行为,以便将来自 asp.net 的标头而不是核心变体放入 BeforeSendRequest() 中,但在第二个请求中,客户端再次发送标头的核心变体,我再次收到有关 NTLM 的相同消息

我可能会尝试在错误的地方寻找错误吗?

【问题讨论】:

  • 这可能是完全错误的,但看起来这是一个区分大小写的问题。 HTTP 请求未使用客户端身份验证方案! 'Ntlm' !!从服务器收到的身份验证标头是 !! 'NTLM' !!.
  • 我想过,但是如果我设置了错误的密码,例如在 asp.net 中我会收到相同的消息

标签: c# asp.net .net wcf asp.net-core


【解决方案1】:

我发现了这种行为的原因。 在asp.net中我没有设置域,只有登录名和密码,它可以工作。 但是在 asp dotnet core 中它对我不起作用,我添加了域。现在它也可以在 asp dotnet core 中工作了。

    var credentials = new NetworkCredential
    {
        UserName = service.Login,
        Password = service.Password,
        Domain = service.Domain
    };
    service.ClientCredentials.Windows.ClientCredential = credentials;

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 2020-02-13
    • 2020-07-21
    • 2021-09-04
    • 1970-01-01
    • 2023-03-07
    • 2019-09-29
    • 2021-03-12
    相关资源
    最近更新 更多