Какие у меня есть варианты?
В этом случае вам необходимо внедрить Диспетчер пользовательской авторизации для вашей службы. Это не так уж сложно сделать, как я делал это несколько раз раньше. В двух словах, вы настраиваете свою службу так, чтобы она указывала на недавно переопределенный метод с именем CheckAccessCore
, в котором вы предварительно формируете логику авторизации. Вы должны быть в состоянии проверить контекст и тело сообщения, чтобы получить любые необходимые учетные данные. Единственное, что нужно понять, это то, что - это некоторые последствия для производительности при проверке тела сообщения на данном этапе, но если у вас нет выбора, по крайней мере, рабочего решения будет достаточно.
Все это происходит до с фактическим вызываемым методом, получая выполнение, что эффективно, потому что метод никогда не вызывается, если они не авторизованы.
Таким образом, здесь может быть типичная конфигурация (некоторые другие конфигурации оставлены для краткости):
<behaviors>
<serviceBehaviors>
<behavior name="MySvcBehavior">
<serviceAuthorization serviceAuthorizationManagerType="MyWCFService.CustomAuthorizationManager, MyWCFService" />
</behavior>
</serviceBehaviors>
<behaviors>
В вашем коде для службы у вас может быть что-то похожее на следующее, или вы используете свои собственные потребности для проверки тела сообщения:
public class CustomAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
IIdentity primaryIdentity = operationContext.ServiceSecurityContext.PrimaryIdentity;
if (primaryIdentity.Name == "user1")
{
return true;
}
else
{
return false;
}
}
}
Вот некоторые примечания, в частности из моего кода, составленного из MSDN: Инфраструктура модели идентификации в Windows Communication Foundation (WCF) поддерживает расширяемую модель авторизации на основе утверждений. Заявки извлекаются из токенов и, необязательно, обрабатываются пользовательскими политиками авторизации, а затем помещаются в AuthorizationContext. Менеджер авторизации проверяет утверждения в AuthorizationContext для принятия решений об авторизации. По умолчанию решения об авторизации принимаются классом ServiceAuthorizationManager; однако эти решения могут быть отменены путем создания собственного диспетчера авторизации. Чтобы создать пользовательский менеджер авторизации, создайте класс, производный от ServiceAuthorizationManager (этот класс), и реализуйте метод CheckAccessCore (выполненный в этом классе). Решения об авторизации принимаются в методе CheckAccessCore, который возвращает «true», когда доступ предоставлен, и «false», когда доступ запрещен.
Вот (2) дополнительные ссылки, которые подтверждают это. Первый - это ссылка MSDN, использующая утверждения в методе. Просто помните, что вы можете сделать все, что вам нужно в пределах CheckAccessCore
. Это просто требует к концу возвращения true
или false
. Вторая ссылка - одна из моего блога, где у меня есть полная реализация, но с использованием аутентификации Windows. Еще раз, детали для вас будут проверять тело сообщения, чтобы получить необходимые детали в рамках этого CheckAccessCore
метода.
Как: создать собственный диспетчер авторизации для службы:
http://msdn.microsoft.com/en-us/library/ms731774.aspx
Как: создать политику аутентификации Windows в стиле ASP.NET для служб WCF:
http://allen -conway-dotnet.blogspot.com / 2010/01 / как к созданию-записи ASPNET-windows.html