【问题标题】:WCF REST Authentication behaviorWCF REST 身份验证行为
【发布时间】:2012-03-06 06:48:36
【问题描述】:

我希望能够对 WCF Rest web 服务进行身份验证,但我不确定如何去做。看起来许多其他问题与 .net 3.5 WCF(例如 WebServiceHost2)中似乎不再存在的东西有关。

我想使用自定义用户名和密码对 WCF 服务进行基于消息的身份验证。据我所知,这可以通过以下常规 WCF 来完成:

<behaviors>
  <serviceBehaviors>
    <behavior name="PasswordValidator">
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom"
                                customUserNamePasswordValidatorType="MyNamespace.PasswordValidator, MyNamespace"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

但是,当我使用 Rest 时,我无法让这个基于 web.config 的行为配置运行。我不知何故需要在我的 serviceRoute 中执行此操作。

RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(HelloService)));

有谁知道如何做到这一点,或者有任何关于使用 Rest 和 WCF 4.0 的基于消息的安全性的好的教程?

【问题讨论】:

标签: wcf .net-4.0 wcf-security


【解决方案1】:

我解决这个问题的方法是实现一个自定义授权属性,该属性查看我添加到 HTTP 标头集合中的两个自定义字段。

这似乎工作得很好。

public class UserAndPasswordAuthenticationAttribute : Attribute, IOperationBehavior, IParameterInspector
    {
        public void ApplyDispatchBehavior(
            OperationDescription operationDescription,
            DispatchOperation dispatchOperation)
        {
            dispatchOperation.ParameterInspectors.Add(this);
        }

        public void AfterCall(string operationName, object[] outputs,
                              object returnValue, object correlationState)
        {
        }

        public object BeforeCall(string operationName, object[] inputs)
        {
            string username = WebOperationContext.Current
                                   .IncomingRequest.Headers["username"];
            string password = WebOperationContext.Current
                                   .IncomingRequest.Headers["password"];


            if (username != "bob" || password!= "123")
            {
                WebOperationContext.Current.OutgoingResponse.StatusCode =
                    HttpStatusCode.Unauthorized;
                throw new UnauthorizedAccessException("");
            }

            return null;
        }

        public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {
        }

        public void Validate(OperationDescription operationDescription)
        {
        }
    }

然后我可以将此属性添加到合同中的方法以保护它们

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多