2013-10-14 53 views
2

我已經實現了一個自定義IDispatchMessageInspector,以解析一個自定義標記類型。解析令牌後,我分配:IDispatchMessageInspector和Thread.CurrentPrincipal

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

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

我想ClaimsPrincipal得到了我IDispatchMessageInspector分配後,它應該在我服務的方法已面市,不幸的是我有一個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> 

EDIT2:

調用序列:

構造器=> GetTokenTypeIdentifiers => TokenType

在GetTokenTypeIdentifiers我返回:

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

如果我第一次給我的服務打電話,這個順序只會佔位。 有趣的是,Handlers方法在調用之後被調用。

回答

-1

對不起,這不是WCF中的身份驗證的工作原理。您不能簡單地從WCF處理管道中的某個位置分配Thread.CurrentPricipal,並假定WCF將自動獲取,作爲證明用戶已通過身份驗證的事實。

您將需要掛鉤到管道的正確位置。這將是一個serviceCredentials behavior

+0

我已經意識到,我在某處WCF堆棧中,CurrentPrincipal只是在服務調用之前覆蓋。問題是WCF堆棧中的正確位置在哪裏? –

+0

我的答案中有一個鏈接。對於使用用戶名/密碼的自定義身份驗證,您可以繼承UsernamePasswordValidator。請參閱:http://msdn.microsoft.com/en-us/library/system.identitymodel.selectors.usernamepasswordvalidator.aspx –

+0

UsernamePasswordValidator如何幫助我傳遞ClaimsPrincipal,這是我在IDispatchMessageInspector中獲得的服務方法? –

0

我能夠把這件事情分類出來。 唯一缺少的是web.config中的一個設置。

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

現在它按預期工作。有沒有安全缺陷?

+0

是不是reasonPermissionMode等於Custom而不是None。 –

+0

這裏沒有任何安全問題,但推薦的方式是通過海關安全令牌處理程序,如Barisa Puters的答案。 –

+0

問題是我已經根據WIF文檔實現了Handler和Token。如果我只是將處理程序添加到web.config文件。它只是沒有被WIF管道調用。這就是我實現IDispatchMessageInspector的原因。 –

1

令牌不應在IDispatchMessageInspector中處理。

您需要實現SecurityTokenHandler,它允許您讀取令牌並提取它攜帶的所有內容=>將其轉換爲索賠集合,然後返回該集合。提供的索賠集合將自動用於通過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中相同的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; 
+0

感謝您的回答。我已經嘗試過這種方法。更重要的是,我已經實現了處理程序和令牌。問題在於Token處理程序沒有被WIF/WCF管道調用,問題是爲什麼它會被調用? WIF管道不知道我的令牌以及它存儲在http消息中的位置。 –

+0

檢查我的編輯。我已經爲您提供了有關如何將處理程序插入到WCF管道中的代碼。 –

+0

再次感謝。我已經做到了......沒有運氣。安全令牌未被調用。如果你有時間審查,我在這裏描述了這個問題。 http://stackoverflow.com/questions/19377021/when-custom-securitytokenhandler-gets-triggered –

相關問題