Asp.Net 4.5使用Windows身份验证和默认凭据使用服务引用

时间:2015-02-14 17:40:01

标签: c# web-services windows-authentication

我的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

抱歉我的英语不好:)

1 个答案:

答案 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的含义是什么,以及它们的工作原理是什么。但是,就目前而言,它奏效了。