Безопасность WCF, пароль пользователя без сертификата - PullRequest
6 голосов
/ 05 июля 2011

Я новичок в WCF .Я привык к * .asmx, но это устарело, поэтому я решил погрузиться в WCF.Мне нужна простая аутентификация по имени пользователя и паролю для моей службы, но везде в Интернете все дело в сертификатах X509.Я хотел бы разместить свой сервис в IIS , поэтому я включу SSL там.

Я следил за некоторыми приветственными уроками по WCF, но меня немного запутали все новые вещи, datacontract, OperationContract, ServiceContract, необходимые интерфейсы, все привязки в web.config, basicHttpBinding и т. Д.

В данный момент я нахожусь на File -> New project -> Visual C# -> WCF -> WCF Service Application

У меня есть своего рода приложение hello world, и я хотел бы знать, как лучше и проще всего его обезопасить.Я прочитал так много разных вещей, что просто не знаю, что лучше для моей ситуации.

Служба, размещенная в IIS, будет доступна в Интернете (с включенным ssl), а также имена пользователей ипароли, которые я хотел бы отправить нескольким доверенным лицам.

Пожалуйста, посоветуйте мне наиболее простую и подходящую систему безопасности.

Редактировать Я пытаюсь подписаться на этот пост:http://codebetter.com/petervanooijen/2010/03/22/a-simple-wcf-service-with-username-password-authentication-the-things-they-don-t-tell-you/ но у меня проблемы с публикацией метаданных.Я предполагаю, что в моем web.config

<system.serviceModel>
    <services>
        <service behaviorConfiguration="WcfServiceSimStars.MyServiceTypeBehaviors" name="FarmService.CustomerDeskOperations">
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="RequestUserName" contract="WcfServiceSimStars.ISimService" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
        </service>
    </services>
    <bindings>
        <wsHttpBinding>
            <binding name="RequestUserName" >
                <security mode="Message">
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://mytestserver/simservice.svc" binding="WSHttpBinding"
            bindingConfiguration="WSHttpBinding_ISimService" contract="WcfServiceSimStars.ISimService"
            name="WSHttpBinding_ISimService" />
    </client>
    <behaviors>
        <serviceBehaviors>
            <behavior name="WcfServiceSimStars.MyServiceTypeBehaviors">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfServiceSimStars.UserValidatorr, WcfServiceSimStars" />
                    <serviceCertificate findValue="Farm" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" />
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

и моем обозревателе решений есть ошибка:

solution explorer

Редактировать 2: Я попытался открыть свой web.config с помощью Microsoft Service Configuration Editor из меню инструментов Visual Studio и получил эту ошибку:

Microsoft Service Configuration Editor

1 Ответ

15 голосов
/ 05 июля 2011

Если вы хотите использовать SSL, вам нужно будет использовать сертификаты X509.

Если вы собираетесь разместить его на IIS и включить SSL, вам потребуется предоставить сертификат, для целей отладки вы можете сгенерироватьсамозаверяющий сертификат из IIS.

После того, как вы настроите его в IIS, вам потребуется отредактировать привязку WCF, чтобы включить SSL.

Вам понадобится привязка с транспортным набором режима безопасности.

<basicHttpBinding>
    <binding name="SecureBinding" receiveTimeout="01:00:00">
      <security mode="Transport" />
    </binding>
</basicHttpBinding>

и безопасное поведение, следующее указывает сертификат ssl, который будет использоваться.

<behaviors>
  <serviceBehaviors>
    <behavior name="SecureBehavior">
      <serviceMetadata />
      <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
      </serviceCredentials>
    </behavior>
    <behavior name="StandardBehavior">
    </behavior>
  </serviceBehaviors>
</behaviors>

, вам необходимо создать защищенную конечную точку

<services>
  <service behaviorConfiguration="SecureBehavior" name="secureService">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" contract="<Your webservice class name including namespace>" />
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
  </service>

Это должно позволить вам использовать SSL на вашем сайте после его размещения.

Для подключения с вашего клиента вы должны использовать следующее (при условии C #)

BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Transport;
EndPointAddress endpointAddress = new EndpointAddress("Your Service address (including HTTPS)");
Client svc = new Client(binding,endpointAddress)

Другим способом будет использование шифрования вместо SSL.Зашифруйте пароль на стороне клиента и отправьте зашифрованные данные в службу, хотя я не совсем уверен в лучших методах для этого.

Надеюсь, это поможет

РЕДАКТИРОВАТЬ

Если вы хотите отправить имя пользователя и пароль в службу, вам просто нужно создать новый метод в службе.

Вы должны определить контракт операции в файле интерфейса.(IService1.cs)

[OperationContract]
bool Login(string password,string username);

тогда вы создадите метод в классе обслуживания (Service1.svc)

public bool Login(string password,string username)
{
    //Your Code to check the username and password here
}

Это, вероятно, самый простой способ сделать это.Другим более сложным способом было бы использовать пользовательский поставщик Membership для аутентификации пользователей.

Вам потребуется создать класс, который наследует от MembershipProvider, и переопределить метод ValidateUser

public class SampleMembershipProvider : MembershipProvider
{ 
    public override bool ValidateUser(string username, string password)
    {
        //check the username and password here
    }


    //No need to override the other methods just leave them
    ....
}

, теперь вам нужночтобы указать webconfig использовать проверку подлинности с помощью форм и использовать свой пользовательский поставщик членства

<authentication mode="Forms" />
<membership defaultProvider="CustomMembershipProvider">
  <providers>
    <clear />
    <add name="CustomMembershipProvider" type="SampleApplication.CustomMembershipProvider" />
  </providers>
</membership>

Теперь, когда у вас настроен поставщик членства, вы можете изменить свой код входа сверху на следующий код, этот код будет проверять подлинностьпользователь и устанавливает файл авторизации.

public bool Login(string password,string username)
{
    if (Membership.ValidateUser(username, password))
    {
        FormsAuthentication.SetAuthCookie(username, false);
        return true;
    }
    return false;
}

Теперь, когда вы вызываете метод в своей службе, вы можете проверить, аутентифицирован ли пользователь, и если это так, вы можете запустить команду, в противном случае - нет.

bool DoWork()
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
         //do something
         return true;
    }
    else
    {
        return false;
    }
}

Дайте мне знать, если вам нужно, чтобы я что-то прояснил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...