WCF REST RequestInterceptor身份验证

tel*_*all 5 authentication rest wcf wcf-security

我试图在WCF RequestInterceptor中进行一些基本身份验证.我正在使用这篇文章作为开始.

我遇到的问题是拦截器和服务之间的通信.我没有尝试任何东西似乎工作.到目前为止,我尝试过:

  • OperationContext.Current
  • requestContext.RequestMessage.Properties [HttpRequestMessageProperty.Name] ["foo"] = value
  • HttpContext.Current.Request

但无论我设置什么,我似乎无法在服务行为本身访问它:

[AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed )]
[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )]
public class AdvertiserService : ApiServiceBase<AdvertiserDataAccessor>, IAdvertiserService
{
    [WebGet( UriTemplate = "" )]
    public List<Advertiser> GetAdvertisers()
    {
        var request = HttpContext.Current.Request;
        var headers = HttpContext.Current.Request.Headers;
        var p = HttpContext.Current.Request.Headers["Principal"];

        OperationContext ctx = OperationContext.Current;
     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 如何在Interceptor和服务之间传递数据?

  2. 是否有一种标准方法可以在它们之间传递身份验证信息(注意,身份验证信息是数据库中的UID,而不是Windows身份)?

谢谢

seb*_*mez 2

您是否使用拦截器创建 SecureWebServiceHostFactory ?

public class SecureWebServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
         WebServiceHost2 host = new WebServiceHost2(serviceType, true, baseAddresses);
         host.Interceptors.Add(new AuthenticationInterceptor());
         return host;
     }
}
Run Code Online (Sandbox Code Playgroud)

我已经使用了该示例并且它有效,请仔细查看您的代码,您可能会遗漏一些东西。