【问题标题】:Setting up culture in WCF based on claim根据声明在 WCF 中设置文化
【发布时间】:2013-03-11 13:44:14
【问题描述】:

我有一个自定义声明,用于确定用户将使用的语言。

我有对 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 中创建的身份。

我应该在哪里设置这种依赖于声明的文化?

【问题讨论】:

    标签: wcf globalization wif


    【解决方案1】:

    对于 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多