2009-10-07 4 views
1

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

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

Спасибо, Iain

ответ

0

, если я правильно понял, вам нужно передать ваш 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(); 
} 
+0

Привет, Рубенс, спасибо за ваш ответ. Я боюсь, что это не работает, потому что он проходит через учетные данные Windows, а не учетные данные для проверки подлинности форм. Спасибо, Iain – Iain

0

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

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

Marc

+0

Мы используем хранилище серверов sql по умолчанию, поэтому пароли являются односторонними хэшами, поэтому их невозможно восстановить. Мы могли бы сохранить пароль, когда пользователь изначально входил в систему, но это то, чего мы бы обязательно хотели избежать. Я думаю, что было бы предпочтительнее жесткого кода для одного пользователя для всех вызовов и прохождения через имя пользователя, зарегистрированного в качестве параметра. – Iain

+0

Я боялся этого :-) В этом случае, я действительно не понимаю, как вы могли это сделать, к сожалению. То, что вы могли бы подумать, - это получить сертификат между вашим сайтом ASP.Net и службой WCF для аутентификации и отправить имя пользователя для входа в систему в качестве заголовка сообщения в информационных целях. Если ваш пользователь уже прошел аутентификацию на веб-сайте ASP.NET, все должно быть хорошо, не так ли? –

0

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