Как мне сделать мои службы wcf доступными для конкретного пользователя?

#c# #wcf #.net-3.5

#c# #wcf #.net-3.5

Вопрос:

Я использую CustomMembershipProvider для проверки пользователя для моей службы WCF. Пользователь получит запрос на свои учетные данные, как только он получит доступ к службе.

Примечание: я думал, что смогу получить имя пользователя и идентифицировать пользователя. Но как передать переменную из CustomMembershipProvider в мой файл службы wcf?

Пользовательский код поставщика членства

Вот код, который я проверяю!

 public override bool ValidateUser(string username, string password)
    {
        int authenticatedId = SecurityManager.Authenticate(username, password);
        if (authenticatedId != -1)
        {
            return true;
        }

        return false;
    }
  

Вот моя базовая фабрика хостов аутентификации

Это вызовет мой CustomMembershipProvider для замены фабрики веб-служб по умолчанию.

 public class BasicAuthenticationHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        var serviceHost = new WebServiceHost2(serviceType, true, baseAddresses);
        serviceHost.Interceptors.Add(RequestInterceptorFactory.Create("DataWebService", new CustomMembershipProvider()));
        return serviceHost;
    }
}
  

Любая помощь будет оценена.

Комментарии:

1. Ну, я использую NHibernate для доступа к базе данных!

2. Как адаптировать мою службу к конкретному пользователю? Если пользователь x входит в систему, я хочу показать данные, связанные с пользователем x. Я не знаю, как передать имя пользователя службе! Что-то вроде переменной сеанса.

Ответ №1:

После выполнения MembershipProvider.ValidateUser SecurityServiceContext должно быть создано действительное значение и добавлено к входящему запросу.

 internal ServiceSecurityContext Create(Credentials credentials)
{
   var authorizationPolicies = new List<iauthorizationpolicy>();
   authorizationPolicies.Add(authorizationPolicyFactory.Create(credentials));
   return new ServiceSecurityContext(authorizationPolicies.AsReadOnly());
}
  

Тогда у вас должен быть доступ к имени пользователя через ServiceSecurityContext.Current.PrimaryIdentity.Name

Я думаю, вы работаете над статьей Базовая аутентификация в службе WCF REST. Автор, похоже, очень отзывчив на вопросы — возможно, вы захотите задать ему несколько вопросов! Удачи!

Комментарии:

1. Спасибо вам за ответ. Вы поняли, я использую WCF REST Service kit! У меня есть какая-то ошибка в учетных данных. Я реализую этот код в OperationContext .