2

我已经实现了一个自定义 IDispatchMessageInspector,以解析一种自定义令牌类型。解析我分配的令牌后:

ServiceSecurityContext.Current.AuthorizationContext.Properties["ClaimsPrincipal"] = claimsPrincipal;

ServiceSecurityContext.Current.AuthorizationContext.Properties["Identities"] = identities;
Thread.CurrentPrincipal = claimsPrincipal;

我想在我的 IDispatchMessageInspector 中分​​配了 ClaimsPrincipal 之后,它应该在我的服务方法中可用,不幸的是我在那里有一个 WindowsPrincipal(IsAuthentificated = false)。

var currentIdentity = Thread.CurrentPrincipal as ClaimsPrincipal;

有什么想法吗?

编辑: 我的 web.config:

<services>
      <service name="EchoService.TestEchoService">
        <endpoint address="api" bindingConfiguration="secured" binding="webHttpBinding" behaviorConfiguration="rest" contract="EchoService.IEchoService"/>
      </service>
    </services>
<behaviors>
      <serviceBehaviors>        
        <behavior>
          <serviceCredentials useIdentityConfiguration="true">                        
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>        
        <behavior name="rest">
          <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true"/>        
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment>
      <serviceActivations>
        <add relativeAddress="echo.svc" factory="System.ServiceModel.Activation.ServiceHostFactory" service="EchoService.TestEchoService"/>
      </serviceActivations>
    </serviceHostingEnvironment>
  </system.serviceModel>
<system.identityModel>
  <identityConfiguration>
    <securityTokenHandlers>
      <clear/>
      <add type="EchoService.Host.Tokens.SimpleWebTokenHandler,EchoService.Host"></add>
    </securityTokenHandlers>    
  <audienceUris>
    <clear/>
    <add value="http://securitytestrealm/"/>
  </audienceUris>
          <issuerTokenResolver type="System.IdentityModel.Tokens.NamedKeyIssuerTokenResolver,System.IdentityModel.Tokens.Jwt">        
            <securityKey symmetricKey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=" name="YYYYYYYYYYYYYYYYYYY" />
          </issuerTokenResolver>
  </identityConfiguration>

编辑2:

调用顺序:

构造函数 => GetTokenTypeIdentifiers => TokenType

在 GetTokenTypeIdentifiers 我返回:

return new string[] { "http://schemas.microsoft.com/2009/11/identitymodel/tokens/swt" };

这个序列只有在我第一次调用我的服务时才会发生。有趣的是,之后调用任何 Handlers 方法都不会被调用。

4

3 回答 3

1

不应在 IDispatchMessageInspector 中处理令牌。

您需要实现 SecurityTokenHandler ,它允许您读取 Token 并提取它携带的任何内容 => 将其转换为声明集合,然后返回该集合。提供的声明集合将自动用于由 WCF 管道创建 ClaimsPrincipal。

检查以下链接:

http://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.validatetoken.aspx

编辑:

您有两种可能的方法将令牌处理程序添加到管道。一是实现自定义服务主机:

public class CustomServiceHost : ServiceHost
{
    protected override void OnOpening()
    {
        base.OnOpening();
        IdentityConfiguration identityConfiguration = new IdentityConfiguration();
        identityConfiguration.SecurityTokenHandlers.Clear();
        identityConfiguration.SecurityTokenHandlers.AddOrReplace(new CustomSecurityTokenHandler());
    }
}

或通过 web.config 中的相同 xml 段:

http://msdn.microsoft.com/en-us/library/hh568671.aspx

编辑:

        ServiceCredentials credentials = this.Description.Behaviors.Find<ServiceCredentials>();
        if (credentials == null)
        {
            credentials = new ServiceCredentials();
            this.Description.Behaviors.Add(credentials);
        }
        credentials.UseIdentityConfiguration = true;
于 2013-10-14T21:09:49.040 回答
0

我能够解决这个问题。唯一缺少的是 web.config 中的一个设置。

<serviceBehaviors>        
<behavior>
<serviceAuthorization principalPermissionMode="None" />

现在它按预期工作。是否存在任何安全漏洞?

于 2013-10-14T13:33:14.083 回答
-1

抱歉,这不是 WCF 中身份验证的工作方式。您不能简单地从 WCF 处理管道中的某个位置分配 Thread.CurrentPricipal 并假设 WCF 会自动将其作为证明用户已通过身份验证的事实。

您将需要连接到管道的正确位置。这将是一个serviceCredentials 行为

于 2013-10-14T12:35:56.177 回答