Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Самая простая аутентификация средствами WCF SOAP / 6 сообщений из 6, страница 1 из 1
05.07.2015, 16:05
    #38999914
anc32
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самая простая аутентификация средствами WCF SOAP
Подскажите, пожалуйста, максимально простые примеры кода аутентификации в WCF SOAP наподобие FormsAuthentication ASP.NET. Просьба не писать ссылки на сторонние ресурсы, т.к. гуглом пользоваться умею.
...
Рейтинг: 0 / 0
06.07.2015, 07:15
    #39000155
МихаилР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самая простая аутентификация средствами WCF SOAP
anc32,

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

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

есть разные методы, всё от задачи зависит.
...
Рейтинг: 0 / 0
07.07.2015, 09:25
    #39001058
МихаилР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самая простая аутентификация средствами WCF SOAP
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
07.07.2015, 10:09
    #39001097
МихаилР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самая простая аутентификация средствами WCF SOAP
Ну и по поводу примера кода...
Вы хотели обойтись без конфигурационных файлов (не знаю почему - мне кажется с конфигами удобнее. Но вам решать, конечно).

Ниже пример настройки аутентификации в коде. Я взял самую простую - 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
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Самая простая аутентификация средствами WCF SOAP / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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