Изменение ролей безопасности WCF / утверждений по параметру метода - PullRequest
0 голосов
/ 21 марта 2011

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

Проблема, с которой я сталкиваюсь, заключается в том, что сообщение запроса не может быть прочитано в классе политики авторизации, посколькуУ меня нет доступа, чтобы написать сообщение обратно в контекст запроса.Я могу скопировать и прочитать сообщение в производном классе ServiceAuthorizationManager, используя переопределение метода CheckAccess.Однако я должен убедиться, что метод GetAuthorizationPolicies уже был вызван до того, как это сделать.

Я ищу предложения о том, как я могу изменить роли участника, в зависимости от того, содержит ли сообщениеконкретный параметр.Обычно, когда идентификатор метода Evaluate вызывается из политики, я хочу сделать что-то вроде этого:

string myObjectId = null;

if (!messageCopy.IsEmpty)
{
    System.Xml.XmlDictionaryReader xdr = messageCopy.GetReaderAtBodyContents();
    xdr.ReadToDecendant("objectId");
    if (xdr.Read())
    {
        myObjectId = xdr.ReadContentAsString();
    }
    xdr.Close();
}
messageCopy.Close();

ClaimSet claims = (myObjectId != null) ?
    MapClaims(identity, myObjectId) : MapClaims(identity);

DefaultPrincipal principal = new DefaultPrincipal(identity, claims);

Ответы [ 2 ]

0 голосов
/ 24 января 2014

Я сталкиваюсь с той же ситуацией при разработке безопасности WebAPI и выбираю следующий подход:

  • Метод, который получает аргумент, создает AuthorizationContext, где он передает аргумент как утверждение ресурса
  • MyЗатем пользовательский ClaimsAuthorizationManager может получить аргумент из AuthorizationContext.Resource и использовать его из авторизации.
0 голосов
/ 22 марта 2011

После целого дня попыток сбоев я перестал пытаться прочитать тело сообщения и использовал более простой метод, добавив заголовок сообщения SOAP. При звонке в сервис я сейчас выполняю следующее:

using (new OperationContextScope((IContextChannel)myService)) {
    OperationContext.Current.OutgoingMessageHeaders.Add(
        MessageHeader.CreateHeader("objectId", "http://tempuri.org/", "object value"));
    myService.BeginMyOperation(parm, callback, state);
}

Затем в методе оценки моей политики авторизации услуг я делаю это:

int index = OperationContext.Current.IncomingMessageHeaders.FindHeader(
    "objectId", "http://tempuri.org/");

string myObjectId = (index < 0) ? null : 
    OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index);

ClaimSet claims = (myObjectId != null) ?
    MapClaims(identity, myObjectId) : MapClaims(identity);

DefaultPrincipal principal = new DefaultPrincipal(identity, claims);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...