8

我有一个我正在尝试运行的基本 ASMX 服务(我宁愿使用 WCF,但无法让服务器使用它)。它在没有安全设置的情况下运行良好,但是一旦我打开安全性,我就会得到:

HTTP 请求未经客户端身份验证方案“匿名”授权。从服务器收到的身份验证标头是“基本领域=“安全区域”。

我想要的是一个简约的询问用户名称和密码类型的解决方案。

用智能感知浏览代码并没有找到我需要的任何东西。

看起来可能很有用,但它似乎是 WCF,所以谁知道。


我刚刚意识到我可以把它变成一个现场演示:

这里是服务:http ://smplsite.com/sandbox3/Service1.asmx

用户名是testapp,密码是testpw。我需要一个命令行应用程序来调用该服务上的函数。

在我添加安全性之前,这条线在Add Web Service Reference该 URL 上运行后在一个基本的 VS 项目中工作

new ServiceReference1.Service1SoapClient().HelloMom("Bob");

这是我目前的尝试(不起作用)

class Program
{
    private static bool customValidation(object s, X509Certificate c, X509Chain ch, SslPolicyErrors e)
    { return true }

    static void Main(string[] args)
    {
         // accept anything
        ServicePointManager.ServerCertificateValidationCallback += 
              new RemoteCertificateValidationCallback(customValidation);

        var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
        binding.Security.Transport.Realm = "Secured area";

        // the generated Web Service Reference class
        var client = new ServiceReference1.Service1SoapClient(
            binding,
            new EndpointAddress("https://smplsite.com/sandbox3/Service1.asmx")
            );

        client.ClientCredentials.UserName.UserName = "testapp";
        client.ClientCredentials.UserName.Password = "testpw";

        Console.WriteLine(client.HelloMom("Bob"));
    }
}

编辑:顺便说一句,这不是网站或在浏览器中运行,访问代码是C# 命令行应用程序。此外,身份验证是由我无法控制的另一个 IIS 插件完成的。

编辑2:要清楚;我正在寻找的解决方案是纯粹的客户端问题。

编辑 3:访问​​控制是通过一种.haccess系统进行的,我喜欢这种方式。我不希望服务代码进行任何身份验证。

4

3 回答 3

12

编辑:
如何使用这个:

MyWebService svc = new MyWebService();            
svc.Credentials = new System.Net.NetworkCredential(UserID, pwd);
bool result = svc.MyWebMethod();    

OP 说这行不通,现在我发现在他的情况下它行不通。

我们做这样的事情:

public class MyWebService : System.Web.Services.WebService
{
    public AuthenticationHeader AuthenticationInformation;

    public class AuthenticationHeader : SoapHeader
    {
        public string UserName;
        public string Password;
    }

    [WebMethod( Description = "Sample WebMethod." )]
    [SoapHeader( "AuthenticationInformation" )]
    public bool MyWebMethod()
    {
        if ( AuthenticationInformation != null )
        {
            if ( IsUserAuthenticated( AuthenticationInformation.UserName,   
                 AuthenticationInformation.Password, ref errorMessage ) )
            {
                 // Authenticated, do something
            }
            else
            {
                 // Failed Authentication, do something
            } 
        }
        else
        {
                 // No Authentication, do something
        }
    }
}

请注意,您提供 IsUserAuthenticated()。

然后客户端这样调用它:

 MyWebService svc = new MyWebService();            
 svc.AuthenticationHeaderValue = new MyWebService.AuthenticationHeader();
 svc.AuthenticationHeaderValue.UserName = UserID;
 svc.AuthenticationHeaderValue.Password = Password;

 bool result = svc.MyWebMethod();
于 2009-04-20T23:00:46.623 回答
2

我将添加一个新的答案,因为我认为这可能会有所帮助:

http://intellitect.com/calling-web-services-using-basic-authentication/

我不会在这里复制它,因为除了谷歌它我什么也没做。

于 2009-04-22T14:27:41.550 回答
2

配置:

<binding name="MyBinding" closeTimeout="00:00:30"
      openTimeout="00:00:30" receiveTimeout="00:00:30" sendTimeout="00:00:30"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
      textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"
      messageEncoding="Text">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
        maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="Transport">
        <transport clientCredentialType="Basic" realm=""/>
      </security>
    </binding>
  </basicHttpBinding>

消费时

proxy.ClientCredentials.UserName.UserName = userName;
proxy.ClientCredentials.UserName.Password = password;

这对我来说很好。

于 2013-03-18T18:28:42.140 回答