ASMX имя пользователя и пароль безопасности - PullRequest
7 голосов
/ 21 апреля 2009

У меня есть базовый сервис ASMX, который я пытаюсь запустить (я бы предпочел использовать WCF, но не могу заставить сервер работать с ним). Он работает нормально без настройки безопасности, но как только я включаю безопасность, я получаю:

HTTP-запрос не авторизован с помощью схемы аутентификации клиента «Anonymous». Заголовок аутентификации, полученный от сервера, был "Basic realm =" Защищенная область "".

Мне нужен минималистичный запрос имени пользователя и пароля Тип решения.

Изучение кода с помощью intellisense не дает ничего похожего на то, что мне нужно.

Это выглядит так, как будто это может быть полезно, но похоже, что это WCF, так что кто знает.


Я только что понял, что могу сделать это живой демонстрацией:

вот услуга: http://smplsite.com/sandbox3/Service1.asmx

имя пользователя testapp и пароль testpw. Мне нужно приложение командной строки, которое вызывает функции этой службы.

До того как я добавил безопасность, эта строка работала в базовом проекте VS после запуска Add Web Service Reference на этом URL

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, и мне это нравится. Я не хочу, чтобы сервисный код выполнял какую-либо аутентификацию.

Ответы [ 3 ]

12 голосов
/ 21 апреля 2009

Edit:
Как насчет использования этого:

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

ОП говорит, что это не сработает, и теперь я вижу, что это не сработает в его ситуации.

Мы делаем что-то вроде этого:

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();
2 голосов
/ 22 апреля 2009

Я собираюсь добавить свежий ответ, потому что я думаю, что это может помочь:

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

Я не буду дублировать это здесь, потому что я ничего не делал, кроме Google.

1 голос
/ 18 марта 2013

Config:

<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;

Это сработало для меня.

...