Служба WCF в режиме ASP.NET Compat - Какой самый простой способ передать имя пользователя / пароль - PullRequest
2 голосов
/ 16 декабря 2008

У меня есть веб-сервис (WCF или ASMX не имеет значения) ... Я сделал консольное приложение, щелкнул правой кнопкой мыши, добавил ссылку на сервис. Пока все хорошо.

Однако я не могу всю жизнь передавать учетные данные «безопасности» в мою службу. Это мой код клиента:

var client = new MyClient();

client.ClientCredentials.UserName.UserName = "bob";
client.ClientCredentials.UserName.Password = "123!!";

client.HelloWorld();

client.Close();

Но на сервере, что бы я ни делал (режим aspnetcompant включается и выключается, служба wcf, служба asmx, пользовательские обработчики http и т. Д.) ... Я не могу найти 'bob: 123 !!' в любом месте. Не в заголовках, не в HttpContext.Current.User.Identiy.Name, не в Thread.CurrentPrincipal ... ничего.

Что мне здесь не хватает?

Ответы [ 8 ]

4 голосов
/ 01 января 2009

Проверяли ли вы эту статью на пользовательских валидаторах: http://www.leastprivilege.com/FinallyUsernamesOverTransportAuthenticationInWCF.aspx?

Кроме того, одна вещь, которая помогла мне, когда я работал над этим, - отключить анонимный доступ к этому каталогу для веб-сервера. HttpContext.Current.User.Identity.Name всегда возвращает пустую строку, когда вы не аутентифицированы. Таким образом, может показаться, что вы правильно проходите аутентификацию и просто не можете «найти» имя пользователя, но на самом деле вы вошли в систему анонимно. По крайней мере, с отключенным доступом anon, вы получите исключение и сможете легче определить сторону аутентификации, что является самой сложной частью.

2 голосов
/ 19 декабря 2008

Да, и, очевидно, если вы не используете SSL, .Net выдает исключение. Очевидно, вы не можете делать то, что я хочу, без SSL.

1 голос
/ 03 марта 2009

См. http://developers.de/blogs/damir_dobric/archive/2006/07/31/890.aspx для получения информации о TransportCredentialOnly, чтобы можно было передавать имена пользователей и пароли без SSL.

Это следует делать только в средах TESTING, поскольку вы предоставляете пароль пользователя в виде простого текста.

0 голосов
/ 22 мая 2009

вы пытались получить доступ к этому? (особенно если вы используете свою собственную систему аутентификации и свои собственные валидаторы UsernamePasssword и Certificate.

System.ServiceModel.ServiceSecurityContext.Current.PrimaryIdentity.Name

Вы можете получить имя звонящего, но не пароль.

0 голосов
/ 01 января 2009

Если я правильно понимаю ваш вопрос, вы успешно настроили аутентификацию по имени пользователя для службы WCF (извините - я сосредоточусь на WCF), и вы хотите получить доступ к имени пользователя и паролю в методах вашего serivce.

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

Одно предложение, которое я нашел в Интернете, которое мне не очень нравится, заключается в том, что ваш пользовательский валидатор должен хранить словарь имени пользователя и паролей, к которому вы могли бы обратиться позже из своего кода, указав имя пользователя.

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

0 голосов
/ 21 декабря 2008

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

Вы пытались включить анонимную аутентификацию на конечной точке (через IIS)? Насколько я понимаю, WCF использует безопасность на уровне сообщений (имя пользователя / пароль, передаваемые в заголовках сообщений), а не заголовки HTTP (используемые в интегрированных методах аутентификации, таких как Windows Integrated, SPNego и т.

некоторые ссылки, которые я нашел ...

0 голосов
/ 19 декабря 2008

Вы настроили тип учетных данных клиента UserName (защита сообщений) или Basic (защита безопасности транспорта) в привязке конечной точки?

...