powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Самая простая аутентификация средствами WCF SOAP
6 сообщений из 6, страница 1 из 1
Самая простая аутентификация средствами WCF SOAP
    #38999914
Фотография anc32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста, максимально простые примеры кода аутентификации в WCF SOAP наподобие FormsAuthentication ASP.NET. Просьба не писать ссылки на сторонние ресурсы, т.к. гуглом пользоваться умею.
...
Рейтинг: 0 / 0
Самая простая аутентификация средствами WCF SOAP
    #39000155
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anc32,

Я не очень понял вопроса.
В каком смысле нужно "подобное"? У WCF нет собственных UI средств, разве что на клиенте может всплывать окно выбора Security Card, но это только для одного мало популярного способа аутентификации.

Напишите конкретнее, что вам нужно.
...
Рейтинг: 0 / 0
Самая простая аутентификация средствами WCF SOAP
    #39000336
Фотография anc32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня сервер сервиса и клиенты расположены на разных машинах под управлением различных ОС. Какие есть варианты реализации аутентификации в таком случае и как они реализуются только в коде (без .config)?
...
Рейтинг: 0 / 0
Самая простая аутентификация средствами WCF SOAP
    #39000522
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anc32У меня сервер сервиса и клиенты расположены на разных машинах под управлением различных ОС. Какие есть варианты реализации аутентификации в таком случае и как они реализуются только в коде (без .config)?

есть разные методы, всё от задачи зависит.
...
Рейтинг: 0 / 0
Самая простая аутентификация средствами WCF SOAP
    #39001058
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anc32,

Вариантов много.
Если говорить совсем кратко, то, при реализации аутентификации в WCF, нужно иметь в виду 2 аспекта:
- Как credentials передаются с клиента на сервис
- Как они проверяются на стороне сервиса

Способы передачи делят на 2 группы:
- Передача на уровне транспортного протокола и средствами этого протокола
- Передача внутри SOAP сообщения (т.е. независимо от протокола - при этом на уровне протокола может осуществляться, например, шифрование).

Среди методов передачи средствами протокола, я бы назвал следующие (только надо помнить, что разные транспорты поддерживают разные способы):
- Basic/Username - передача пользователя и пароля в открытом виде
- Digest/Ntlm/Windows - передача пользователя и пароля, но в защищенном виде (передаются не сами пароли, а их производные функции, причем от случайных данных).
- Certificate - передача сертификата (ну т.е. конечно же передается не сам сертификат, а некий результат применения закрытого ключа. Если не ошибаюсь, то делается просто ЭЦП).

У методов на основе SOAP добавляется еще один вариант:
- Issued Token - это когда клиент сначала аутентифицируется у третьей стороны, получает токен, а затем с этим токеном ходит на сервис.


Что касается методов проверки переданных данных, то тут ситуация следующая:
- при передаче пользователя и пароля WCF автоматически проверяет их средствами Windows (т.е. аутентифицируют локально или в Active Directory). И у вашего кода нет возможности вмешаться в этот процесс.
- есть только 2 законных варианта вмешаться в этот процесс:
а) Вы передаете аутентификацию на уровне сообщений методом UserName
б) Вы передаете аутентификацию на уровне сообщений методом Basic. НО (!) только если хостите ваш сервис не под IIS
В этих 2-х случаях вы можете написать свой собственный метод проверки, создав класс наследник от UserNamePasswordValidator


Варианты аутентификации с помощью сертификатов и Issued Token я не рассматриваю - они сложнее обычной парольной аутентификации. Но даже без них - море вариантов.
...
Рейтинг: 0 / 0
Самая простая аутентификация средствами WCF SOAP
    #39001097
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и по поводу примера кода...
Вы хотели обойтись без конфигурационных файлов (не знаю почему - мне кажется с конфигами удобнее. Но вам решать, конечно).

Ниже пример настройки аутентификации в коде. Я взял самую простую - Windows-аутентификацию и работу поверх WSHttpBinding (чтобы не настраивать SSL).

Вот контракт сервиса:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
using System.ServiceModel;

namespace SimpleService
{
	[ServiceContract]
	public interface ISimpleService
	{
		[OperationContract]
		string Method();
	}
}



Реализация (чтобы показать аутентификацию разных пользователей):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using System.ServiceModel;

namespace SimpleService.Host
{
	class SimpleServiceImpl : ISimpleService
	{
		public string Method()
		{
			return OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
		}
	}
}



Код хоста:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
using System;
using System.ServiceModel;

namespace SimpleService.Host
{
	class Program
	{
		static void Main(string[] args)
		{
			using (var host = new ServiceHost(typeof (SimpleServiceImpl)))
			{
				var binding = new WSHttpBinding();
				binding.Security.Mode = SecurityMode.Message;
				binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

				host.AddServiceEndpoint(typeof(ISimpleService), binding, 
					"http://localhost/Temporary_Listen_Addresses/SimpleService");

				host.Open();
				Console.WriteLine("Service started");
				Console.ReadLine();
				host.Close();
			}
		}
	}
}




Примеры кода клиента:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
using System;
using System.ServiceModel;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace SimpleService.Client
{
	[TestClass]
	public class AuthenticationSample
	{
		WSHttpBinding binding = new WSHttpBinding
			{
				Security =
				{
					Mode = SecurityMode.Message,
					Message = { ClientCredentialType = MessageCredentialType.Windows }
				}
			};

		[TestMethod]
		public void CurrentUserAithentication()
		{
			var factory = new ChannelFactory<ISimpleService>(binding,
				"http://localhost/Temporary_Listen_Addresses/SimpleService");

			var client = factory.CreateChannel();
			Console.WriteLine(client.Method());
		}

		[TestMethod]
		public void DifferentUserAithentication()
		{
			var factory = new ChannelFactory<ISimpleService>(binding,
				"http://localhost/Temporary_Listen_Addresses/SimpleService");
			factory.Credentials.Windows.ClientCredential =
				new System.Net.NetworkCredential("TestUser", "123");

			var client = factory.CreateChannel();
			Console.WriteLine(client.Method());
		}
	}
}
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Самая простая аутентификация средствами WCF SOAP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]