Динамические сервисные контракты WCF на основе учетных данных аутентификации - PullRequest
1 голос
/ 20 декабря 2010

1) Я хочу, чтобы клиентское приложение добавляло ссылку на службу WCF

2) Клиентское приложение должно иметь возможность отправлять учетные данные для этой службы WCF

3) На основеРазрешения для учетных данных, служба WCF должна возвращать соответствующий интерфейс (контракт на обслуживание) клиенту

4) Клиент затем использует его.

например, предположим, у меня есть класс на сервере, который определяет сущность с именем «Актив»'и у меня есть несколько методов, связанных со всеми возможными операциями над ним

Class Asset
{
 Add()
 {
 .....
 }

 Edit()
 {
 ......
 }

 Flag()
 {
 ......
 }

 Deploy()
 {
 ........
 }
}

Теперь у меня есть клиентское приложение, которое хочет выполнить некоторые действия над «Активом».Но я не хочу отдавать весь класс DLL клиенту.Вместо этого хочу дать только интерфейс.какой клиент может потреблять и вызывать соответствующие действия над ним.

Теперь проблема в том, что клиентское приложение добавляет ссылку на службу WCF.Каким образом соответствующий интерфейс для класса активов может быть возвращен клиенту на основе его WS * или учетных данных аутентификации.Предоставляет ли .Net 4.0 простой способ динамического создания и возврата контракта на обслуживание?

, например,

//following is pseudo code
If(Current.User.Role == 'Admin')
{
 return IAssetsForAdmin;
}
else
{
 return IAssetsForGeneralUser;
}

Interface IAssetForAdmin
{
 Add();
 Edit();
 Flag();
}

Interface IAssetForGeneralUser
{
 Flag();
}

1 Ответ

1 голос
/ 20 декабря 2010

Это невозможно. Вы не можете вернуть другой контракт для каждой роли пользователя. Более того, это относится не только к WCF, но и ко всей архитектуре веб-служб и архитектуре .NET, поскольку определение нового контракта = определение новой ссылки на службу = перекомпиляция приложения.

Но это можно легко решить с помощью безопасности на основе ролей. Аутентифицированный пользователь будет членом какой-либо роли, которой будет разрешено выполнять только выбранные операции. Чтобы этого добиться, вы должны использовать PrincipalPermission (для обязательного запроса разрешений) или PrincipalPermissionAttribute (для декларативного запроса разрешений). Если неавторизованный пользователь вызывает защищенный метод, будет выдано исключение SecurityException. Единственное, что вам нужно, это правильно настроить модель безопасности WCF, чтобы роли назначались аутентифицированным пользователям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...