我有一个自定义声明,用于确定用户将使用的语言。
我对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 :(得分: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;