2009-04-22 2 views
2

Я пытаюсь выполнить следующий сценарий:wsFederationHttpBinding, передавая пользовательские идентификационные данные пользователя STS

  1. Клиент передает свои cridentials в STS.
  2. STS применяет пользовательскую лицензию AuthorizationPolicy для определения набора требований, доступных конкретному пользователю, и выдает защищенный токен.
  3. Клиент передает токен бизнес-службам, которые определяют пользовательские привилегии на основе набора требований, полученных ими от токена.

Похоже, первый шаг является основной проблемой. Как MSDN предлагает элемент сообщения wsFederationHttpBinding не имеет clientCredentialsType. В результате всякий раз, когда моя AuthorizationPolicy проверяет оценкуContext.Properties ["Identities"], она видит в ней WindowsIdentity. Я хотел бы аутентифицировать пользователя для пользовательского хранилища (DB).

Есть ли способ сделать это с помощью wsFederationHttpBinding?

ответ

1

Ну, вот ответ

STS конфигурации:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="STSBehaviour"> 
      <!--Custom credentials processing--> 
      <serviceCredentials> 
       <userNameAuthentication userNamePasswordValidationMode="Custom" 
             customUserNamePasswordValidatorType="SecurityTokenService.UserNameValidator, SecurityTokenService"/> 
      </serviceCredentials> 
      <!---------------------------------> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <wsHttpBinding> 
     <binding name="wsHttpUsername"> 
      ... 
      <security mode="Message"> 
       <message clientCredentialType="UserName" 
         negotiateServiceCredential="false" 
         establishSecurityContext="false" /> 
      </security> 
      ... 
     </binding> 
    </wsHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration ="STSBehaviour" 
       name="Microsoft.ServiceModel.Samples.SecurityTokenService" > 
      .... 
    </service> 
</services> 

Имя пользователя валидатор

public class UserNameValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     if (!VerifyCredentials(userName, password)) 
      throw new SecurityException("Invalid credentials"); 
    } 
}