2013-03-11 2 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; 
Смежные вопросы