在WCF建立基于索赔的文化



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

我有claimprincipal的扩展,它检查该声明并生成适当的文化:

    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管道中找到合适的点,我可以设置线程。CurrentCulture .

我试过ICallContextInitializer, IDispatchMessageInspector,但上面没有一个可以看到我的claimprincipal(它被空主体覆盖)。但是,在我的服务操作中,claimprincipal。当前正确指向我在UserNameSecurityTokenHandler中创建的身份。

我应该在哪里设置这个与声明相关的区域性?

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

相关内容

  • 没有找到相关文章

最新更新