代码之家  ›  专栏  ›  技术社区  ›  CodingWithSpike

WCF用户名验证:我可以在自定义ServiceAuthorizationManager中获取用户名吗?

  •  4
  • CodingWithSpike  · 技术社区  · 17 年前

    ServiceAuthorizationManager . 自定义身份验证管理器已设置为处理Windows和窗体身份验证。

    但是,如果我连接的客户端设置为 UserName auth,我似乎在任何地方都找不到用户名。

    客户端代码如下所示:

    this.ClientCredentials.UserName.UserName = "user";
    this.ClientCredentials.UserName.Password = "pass";
    this.Open();
    this.MyMethod(); // my actual contract method
    this.Close();
    

    public sealed class AppAuthorizationManager : ServiceAuthorizationManager
    {
        public override bool CheckAccess(OperationContext operationContext, ref Message message)
        {
            // would like to check user/pwd here...
        }
    }
    

    这可能吗?

    • 这个 Thread.CurrentPrincipal 没有设定,,
    • operationContext.ServiceSecurityContext.PrimaryIdentity
    • operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets 是空的。

    用户/pwd是否应该在任何地方可用?还是我必须添加自定义 UsernamePasswordValidator


    更新: 所以我添加了一个自定义项 UserNamePasswordValidator IAuthorizationPolicy . 我更新的WCF配置如下所示:

    <behavior name="Server2ServerBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="MyApp.AuthManager, MyApp">
        <authorizationPolicies>
          <add policyType="MyApp.TokenAuthorizationPolicy, MyApp" />
        </authorizationPolicies>
      </serviceAuthorization>
      <serviceCredentials>
        <userNameAuthentication customUserNamePasswordValidatorType="MyApp.PFUserNameValidator, MyApp" />
      </serviceCredentials>
    </behavior>
    

    如果我在所有3个类中设置了断点,WCF将抛出异常:

    LogonUser failed for the 'username' user. Ensure that the user has a valid Windows account.
       at System.IdentityModel.Selectors.WindowsUserNameSecurityTokenAuthenticator.ValidateUserNamePasswordCore(String userName, String password)
    

    1 回复  |  直到 13 年前
        1
  •  6
  •   Marc Gravell    17 年前

    这通常是在 UsernamePasswordValidator IAuthorizationPolicy Evaluate

    bool IAuthorizationPolicy.Evaluate(
        EvaluationContext evaluationContext, ref object state)
    {           
        IList<IIdentity> idents;
        object identsObject;
        if (evaluationContext.Properties.TryGetValue(
            "Identities", out identsObject) && (idents =
            identsObject as IList<IIdentity>) != null)
        {
            foreach (IIdentity ident in idents)
            {
                if (ident.IsAuthenticated &&
                    ident.AuthenticationType == TrustedAuthType)
                {                           
                    evaluationContext.Properties["Principal"]
                        = //TODO our principal
                    return true;
                }
            }
        }
        if (!evaluationContext.Properties.ContainsKey("Principal"))
        {
            evaluationContext.Properties["Principal"] = //TODO anon
        }                
        return false;
    }
    

    (在哪里 TrustedAuthType 是我们的密码验证程序的名称)

    推荐文章