Передавать информацию для входа при каждом вызове веб-службы WCF? - PullRequest
1 голос
/ 23 февраля 2011

Привет

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

Можно создать CustomUserNamePasswordValidation, но для этого требуется защищенная (SLL) связь. В нашем случае нам не нужна безопасность, а решение должно быть максимально простым в настройке.

Итак, вопрос в том, как отправить идентификацию клиента (имя пользователя / пароль) при каждом вызове?

Я мог бы поместить идентификационные данные в заголовок , но я не уверен, как это можно проверить на примере soupUI ? И я не уверен, что все системы, которые будут взаимодействовать, смогут справиться с этим без осложнений?

Любые предложения?

Обратите внимание: я хочу сделать только 1 звонок, поэтому не нужно использовать метод входа в систему.

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

WCF не поддерживает отправку учетных данных пользователя без защиты. Чтобы решить эту проблему, вы можете использовать очистить привязку имени пользователя или добавить учетные данные вручную в заголовок сообщения (это просто с WCF)

0 голосов
/ 23 февраля 2011

В коде:

public class WCF_Project_Authentification : UserNamePasswordValidator
{
    #region UserNamePasswordValidator Interface Member

    public override void Validate(string userName, string password)
    {
        if (userName != "Jeanc" || password != "fortin")
        {
            throw new FaultException("Authentification failed");
        }
    }
    #endregion
}

В конфиге:

 <behaviors>
      <serviceBehaviors>
        <behavior name="Service_Behavior">
          <serviceMetadata httpGetEnabled="False" httpsGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>
          <serviceCredentials>

            <userNameAuthentication userNamePasswordValidationMode="Custom"
                                    customUserNamePasswordValidatorType="WcfService.Authentification.WCF_Project_Authentification, WcfService"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>

И в коде клиента:

proxy.ClientCredentials.UserName.UserName = "Jeanc";
proxy.ClientCredentials.UserName.Password = "fortin";
0 голосов
/ 23 февраля 2011

Определите привязку в файле web.config следующим образом:

<basicHttpBinding>
    <binding name="BasicAuthBinding">
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </basicHttpBinding>

Затем определите поведение службы, например:

<behavior name="Namespace.TestBehaviour">
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom"
          customUserNamePasswordValidatorType="Namespace.ServiceSecurity.UserAuthenticator, Namespace" />
      </serviceCredentials>
      <serviceAuthorization>
        <authorizationPolicies>
          <add policyType="Namespace.ServiceSecurity.MyAuthorizationPolicy, Namespace" />
        </authorizationPolicies>
      </serviceAuthorization>
    </behavior>

Затем предоставьте пользовательские классы аутентификации и авторизации следующим образом: *Аутентификация 1007 *

public class MyAuthorizationPolicy: IAuthorizationPolicy
{
    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    {
        IList<IIdentity> identities = (IList<IIdentity>) evaluationContext.Properties["Identities"];

        foreach (IIdentity identity in identities)
        {
            if (identity.IsAuthenticated &&
                identity.AuthenticationType == "UserAuthenticator")
            {
                evaluationContext.Properties["Principal"] = identity.Name;
                return true;
            }
        }

        if (!evaluationContext.Properties.ContainsKey("Principal"))
        {
            evaluationContext.Properties["Principal"] = "";
        }
        return false;
    }

    public ClaimSet Issuer
    {
        get { throw new NotImplementedException(); }
    }
}

выглядит следующим образом:

public class UserAuthenticator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        //authenticate me however you want
        //then set whatever you want
    }
}

Если вам нужна дополнительная безопасность, измените basicHttpBinding на wsHttpBinding и используйте сертификат

РЕДАКТИРОВАТЬ: Почти забыл, используйте определенныеповедение сервиса и привязка в определении интерфейса сервиса в web.config.

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