Как передать зарегистрированные данные пользователя из веб-приложения ASP.Net службе WCF? - PullRequest
1 голос
/ 07 октября 2009

У меня есть 2 веб-приложения: одно - веб-приложение ASP.Net, а другое - приложение веб-служб ASP.Net WCF. Я хочу, чтобы веб-приложение использовало сервисы веб-приложения WFC. В конечном итоге эти 2 приложения будут взаимодействовать через брандмауэр.

Я хочу, чтобы пользователь вошел в клиентское веб-приложение с использованием проверки подлинности с помощью форм, аутентифицированной службой wcf, а затем получил доступ к ресурсам службы на основе своих ролей.

До сих пор мне удалось войти в систему с помощью System.Web.ApplicationServices.AuthenticationService, хотя я не смог заставить метод службы IsLoggedIn вернуть значение true. Однако клиентское веб-приложение распознает, что пользователь вошел в систему.

Кроме того, я смог создать фиктивную службу, которая распознает пользователя в OperationContext.Current.ServiceSecurityContext.PrimaryIdentity, и я подумал, что это был зарегистрированный пользователь, который он распознавал, но оказалось, что на самом деле это ServiceClient .ClientCredentials.UserName, который он распознает. Как я могу передать информацию о вошедшем в систему пользователе службе WCF?

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

Я использую здесь совершенно неправильный подход или мне чего-то не хватает? Любой совет будет оценен.

Это моя обязательная конфигурация:

  <wsHttpBinding>
    <binding name="wsHttp">  
      <security mode="Message">  
        <message clientCredentialType="UserName"  
          negotiateServiceCredential="false"  
          establishSecurityContext="false"/>  
      </security> 
    </binding> 
  </wsHttpBinding>  

Спасибо, Иэн

Ответы [ 3 ]

0 голосов
/ 07 октября 2009

Определенно вы можете получить зарегистрированного в данный момент пользователя в ASP.NET, используя свойство HttpContext.Current.User.Identity.Name - проблема в том, что, как правило, у вас нет никакого способа получить пароль пользователя для вызова службы WCF.

Это действительно зависит от того, как вы проводите проверку подлинности с помощью форм. У вас есть собственный магазин? Имеется ли в этом хранилище пароль пользователя в форме, которую можно использовать, например, пароль пользователя хранится в виде простого текста (плохая идея!) или в схеме обратимого шифрования?

Марк

0 голосов
/ 09 октября 2009

Я пытался сделать что-то подобное в SharePoint. Лучшее решение, которое я смог найти, это:

 using (ChannelFactory<IMyContract> requestChannelFactory = new ChannelFactory<IMyContract>(binding, new EndpointAddress(endPointURL)))
 {
     provider = requestChannelFactory.CreateChannel();
     using (HostingEnvironment.Impersonate())
     {
         remoteData = provider.GetData();
     }
 }

Это пытается аутентифицировать меня как DOMAIN \ SERVER $, но, к сожалению, я не нашел способа извлечь учетные данные клиента из HttpContext и вставить их в requestChannelFactory.Credentials.Windows.ClientCredential. Я уверен, что это невозможно сделать. Кажется, альтернативой является жесткое кодирование имени пользователя / пароля или использование аутентификации сертификата. Это или разрешить анонимную аутентификацию, которая мне не подходит.

0 голосов
/ 07 октября 2009

если я правильно понял, вам нужно передать свои учетные данные зарегистрированного пользователя ASP.NET службе WCF, верно? Попробуйте этот подход:


using (YourServiceClient client = new YourServiceClient())
{
     client.ClientCredentials.Windows.AllowedImpersonationLevel = 
          System.Security.Principal.TokenImpersonationLevel.Impersonation;
     client.ChannelFactory.Credentials.Windows.ClientCredential = 
          CredentialCache.DefaultNetworkCredentials;
     client.YourMethodHere();
}
...