使用System.ServiceModel.ServiceAuthenticationManager进行自定义WCF身份验证?

时间:2010-09-15 08:12:41

标签: wcf authentication

我正在进行自定义WCF身份验证和授权,并找到了一些关于 UserNamePasswordValidator ServiceAuthorizationManager 的文章。

我还找到了关于使用自定义 System.ServiceModel。 ServiceAuthenticationManager 死链接)的线索,但msdn没有说明很多它(http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthenticationmanager.aspx)。

所以我在这里:任何人都更了解ServiceAuthenticationManager?

通常,您将如何设置自定义WCF身份验证?

1 个答案:

答案 0 :(得分:36)

你是对的,关于此的文档根本没有帮助。

我使用这个类的方法如下。将Authenticate()方法重写为:

  1. 从传入消息中提取身份验证令牌(例如用户名/密码)
  2. 对令牌进行身份验证并使用它们来创建IPrincipal对象。这将是在调用服务操作期间使用的主体。
  3. 将IPrincipal对象添加到message.Properties集合中,以便稍后在WCF处理管道中使用
  4. 您不能在此时设置线程主体,因为它稍后由WCF更改。

    ServiceAuthenticationManager.Authenticate()方法中的代码如下所示:

    public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message)
    {
       int tokenPosition = message.Headers.FindHeader("Token", "http://customnamespace.org");
       string token = message.Headers.GetHeader<string>(tokenPosition);
    
       IPrincipal user = new CustomPrincipal(token);
    
       message.Properties["Principal"] = user;
    
       return authPolicy;
    }
    

    然后添加

    的自定义授权策略
    1. 从消息中检索IPrincipal(使用System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties集合)。
    2. 将IPrincipal推送到EvaluationContext.Properties集合
    3. 根据IPrincipal.IsInRole()方法提出声明
    4. IAuthorizationPolicy()方法中的代码看起来像

      public bool Evaluate(EvaluationContext evaluationContext, ref object state)
      {
          IPrincipal user = OperationContext.Current.IncomingMessageProperties["Principal"] as IPrincipal;
          evaluationContext.Properties["Principal"] = user;
          evaluationContext.Properties["Identities"] = new List<IIdentity> { user.Identity };
      
          IList<Claim> roleClaims = this.GetRoleClaims(user);
      
          evaluationContext.AddClaimSet(this, new DefaultClaimSet(this.Issuer, roleClaims));
      
          return true;
      }
      

      在服务行为配置中,您需要设置principalPermissionMode =“Custom”,以便WCF将IPrincipal设置为执行线程上用于实际服务操作调用的主体。

      <serviceAuthorization principalPermissionMode="Custom"...