NServiceBus:传出消息转换器中的标识上下文

NServiceBus:传出消息转换器中的标识上下文,nservicebus,mutators,Nservicebus,Mutators,NServiceBus 4.4.0 嗨 我使用消息变异器进行非音素化。基本上,我在传出的mutator中序列化JWT令牌中的ClaimsPrincipal.Identity,并在传入的mutator中反序列化它,以将其添加到NServiceBus主机应用程序的主体中。(基于本文:)。问题是,当我们在传出的mutator(IMutateOutgoingTransportMessages)中时,ClaimsPrincipal.Identity并不包含所有声明。只有名字。但是如果我在“Bus.Send

NServiceBus 4.4.0

我使用消息变异器进行非音素化。基本上,我在传出的mutator中序列化JWT令牌中的ClaimsPrincipal.Identity,并在传入的mutator中反序列化它,以将其添加到NServiceBus主机应用程序的主体中。(基于本文:)。问题是,当我们在传出的mutator(IMutateOutgoingTransportMessages)中时,ClaimsPrincipal.Identity并不包含所有声明。只有名字。但是如果我在“Bus.Send”命令之前查看,我有正确的声明(组、权限等)

传出消息mutator驻留在一个外部类中,由我的主项目引用。下面是传出的mutator的代码:

public class OutgoingAccessMutator : IMutateOutgoingTransportMessages, INeedInitialization
{
    public IBus Bus { get; set; }

    public void Init()
    {
        Configure.Instance.Configurer.ConfigureComponent<OutgoingAccessMutator>(DependencyLifecycle.InstancePerCall);
    }

    public void MutateOutgoing(object[] messages, TransportMessage transportMessage)
    {
       if (!transportMessage.Headers.ContainsKey(Common.Constants.Securite.AuthenticationTokenID))
        {
            transportMessage.Headers[Common.Constants.Securite.AuthenticationTokenID] =
                TokenHelper.GenerateToken(ClaimsPrincipal.Current.IdentitePrincipale() as ClaimsIdentity);
        }
    }
}
然后在另一个进程(windows服务可执行主机)中的传入消息mutator中,我将其反序列化:

public class IncomingAccessTokenMutator : IMutateIncomingTransportMessages, INeedInitialization
{
    public IBus Bus { get; set; }

    public void Init()
    {
        Configure.Instance.Configurer.ConfigureComponent<IncomingAccessTokenMutator>(DependencyLifecycle.InstancePerCall);
    }

    public void MutateIncoming(TransportMessage transportMessage)
    {

        if (transportMessage.Headers.ContainsKey(Common.Constants.Securite.AuthenticationTokenID))
        {
            try
            {
                var token = transportMessage.Headers[Common.Constants.Securite.AuthenticationTokenID];
                var identity = TokenHelper.ReadToken(token);
                if (identity != null)
                {
                    identity.Label = Common.Constants.Securite.NomIdentitePrincipale;
                    ClaimsPrincipal.Current.AddIdentity(identity);
                }
            }
            catch (Exception)
            {
                Bus.DoNotContinueDispatchingCurrentMessageToHandlers();
                throw;
            }
        }
    }
}
公共类IncomingAccessTokenMutator:IMutateIncomingTransportMessages,初始化无效
{
公共IBus总线{get;set;}
公共void Init()
{
Configure.Instance.Configurer.ConfigureComponent(DependencyLifecycle.InstancePerCall);
}
public void MutateIncoming(TransportMessage TransportMessage)
{
if(transportMessage.Headers.ContainsKey(Common.Constants.Securite.AuthenticationTokenID))
{
尝试
{
var token=transportMessage.Headers[Common.Constants.Securite.AuthenticationTokenID];
var identity=TokenHelper.ReadToken(令牌);
如果(标识!=null)
{
identity.Label=Common.Constants.Securite.nominidentitePrincipale;
ClaimsPrincipal.Current.Additionity(标识);
}
}
捕获(例外)
{
Bus.DoNotContinueDispatchingCurrentMessageToHandlers();
投掷;
}
}
}
}

有人知道为什么mutator和发送消息的服务中的标识上下文不一样吗?

也在特定的google组中讨论过:您在任何调用中都使用async吗?调用
ClaimsPrincipal.Current
将创建一个名为claim的基本主体(如果没有)。我要确认代码是在同一线程上运行的,也在特定的google组上讨论过:您在任何调用中都使用async吗?调用
ClaimsPrincipal.Current
将创建一个名为claim的基本主体(如果没有)。我会确认代码在同一线程上运行
public class IncomingAccessTokenMutator : IMutateIncomingTransportMessages, INeedInitialization
{
    public IBus Bus { get; set; }

    public void Init()
    {
        Configure.Instance.Configurer.ConfigureComponent<IncomingAccessTokenMutator>(DependencyLifecycle.InstancePerCall);
    }

    public void MutateIncoming(TransportMessage transportMessage)
    {

        if (transportMessage.Headers.ContainsKey(Common.Constants.Securite.AuthenticationTokenID))
        {
            try
            {
                var token = transportMessage.Headers[Common.Constants.Securite.AuthenticationTokenID];
                var identity = TokenHelper.ReadToken(token);
                if (identity != null)
                {
                    identity.Label = Common.Constants.Securite.NomIdentitePrincipale;
                    ClaimsPrincipal.Current.AddIdentity(identity);
                }
            }
            catch (Exception)
            {
                Bus.DoNotContinueDispatchingCurrentMessageToHandlers();
                throw;
            }
        }
    }
}