代码之家  ›  专栏  ›  技术社区  ›  Dmitry Ornatsky

wsfederationhttpbinding,将自定义用户标识传递给sts

  •  2
  • Dmitry Ornatsky  · 技术社区  · 15 年前

    我正在尝试实现以下场景:

    1. 客户将其呼号传递给STS。
    2. STS应用自定义授权策略来确定特定用户可用的声明集,并颁发安全令牌。
    3. 客户端将令牌传递给业务服务,业务服务根据从令牌获取的声明集确定用户的权限。

    看起来第一步是主要问题。AS MSDN 建议wsFederationHttpBinding的消息元素没有ClientCredentialStype。因此,每当我的授权策略检查evaluationContext.properties[“identities”]时,它都会在其中看到windowsIdentity。我想根据自定义存储(DB)对用户进行身份验证。

    有没有办法用wsFederationhttpBinding来完成它?

    1 回复  |  直到 10 年前
        1
  •  1
  •   Dmitry Ornatsky    15 年前

    好吧,这是答案

    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");
        }
    }