我的Intranet上有一个Web应用程序,配置为在IIS上使用Windows身份验证。我们有一个Windows网络和一个活动的dircory服务器,所以当一些用户尝试访问该应用程序时,浏览器不会要求登录和密码,因为它使用当前登录用户的Windows凭据。
我在此应用程序中添加了一个web服务,并尝试在Windows应用程序中使用它。我尝试时收到错误401。用户已经使用自己的凭据登录Windows,因此我希望我的Windows应用程序使用当前用户的凭据登录到Web服务。
我的服务:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace MyWebServices
{
/// <summary>
/// Summary description for TestWS
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class TestWS : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
}
我的控制台应用程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyWebServiceClient
{
class Program
{
static void Main(string[] args)
{
TWS.TestWSSoapClient svc = new TWS.TestWSSoapClient();
try
{
Console.WriteLine(svc.HelloWorld());
}
catch (Exception err)
{
Console.WriteLine(err.ToString());
}
finally
{
Console.ReadLine();
}
}
}
}
都是.net framework 4.5
抱歉我的英语不好:)
答案 0 :(得分:0)
我找到了。 我需要创建一个基本的http绑定并将其设置为Windows的客户端凭据类型。它也适用于ntlm。
我必须创建一个endpont地址并将http绑定和端点地址传递给我的SoapClient构造函数。
static void Main(string[] args)
{
try
{
System.ServiceModel.BasicHttpBinding MyHttpBinding = new System.ServiceModel.BasicHttpBinding(System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly);
MyHttpBinding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows;
//MyHttpBinding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Ntlm; //works too
System.ServiceModel.EndpointAddress MyAuthASMXWebServiceAddress = new System.ServiceModel.EndpointAddress(new Uri("http://localhost/TestWS.asmx"));
TWS.TestWSSoapClient svc = new TWS.TestWSSoapClient(MyHttpBinding, MyAuthASMXWebServiceAddress);
Console.WriteLine(svc.HelloWorld());
}
catch (Exception err)
{
Console.WriteLine(err.ToString());
}
finally
{
Console.ReadLine();
}
}
我仍然不知道BasicHttpSecurityMode.TransportCredentialOnly的含义是什么,以及它们的工作原理是什么。但是,就目前而言,它奏效了。