2013-03-11 45 views
0

我有一個自定義聲明,用於確定用戶將要使用的語言。在基於聲明的WCF中設置文化

我有擴展ClaimsPrincipal,即檢查該要求,併產生相應的文化:

public static CultureInfo Culture(this ClaimsPrincipal principal) 
    { 
     Claim claim = principal.FindFirst(CustomClaimTypes.Language); 
     if (claim == null) 
      return CultureInfo.CreateSpecificCulture("en"); 
     else 
      return CultureInfo.CreateSpecificCulture(claim.Value); 
    } 

我也實現的自定義UserNameSecurityTokenHandler和定製ClaimsAuthorizationManager和都工作得不錯。實際上整個解決方案工作得很好,除了我無法在WCF管道中找到適當的點,我可以根據上面的擴展來設置Thread.CurrentCulture。

我試過ICallContextInitializer,IDispatchMessageInspector,但以上都不能看到我的ClaimsPrincipal(它被空主體重寫)。但是,在我的服務操作中,ClaimsPrincipal.Current正確指出了我在UserNameSecurityTokenHandler中創建的標識。

我應該在哪裏設置這種依賴於聲明的文化?

回答

0

對於WCF數據服務我使用ProcessingRequest事件:

public class ConfigurationManagementDataService : SecurityDataService<ConfigurationContext> 
{ 
public ConfigurationManagementDataService() 
    { 
     Database.SetInitializer<ConfigurationContext>(null); 
     ProcessingPipeline.ProcessingRequest += OnProcessingRequest; 
    } 
public void OnProcessingRequest(object sender, DataServiceProcessingPipelineEventArgs dataServiceProcessingPipelineEventArgs) 
    { 
    //assign IPrincipal to a Thread.Principal 
    //we must set both, but Thread.CurrentPrincipal is a main 
     if (context != null) 
     { 
      context.User = principal; 
     } 

     Thread.CurrentPrincipal = principal;