NServiceBus:传出消息转换器中的标识上下文
NServiceBus 4.4.0 嗨 我使用消息变异器进行非音素化。基本上,我在传出的mutator中序列化JWT令牌中的ClaimsPrincipal.Identity,并在传入的mutator中反序列化它,以将其添加到NServiceBus主机应用程序的主体中。(基于本文:)。问题是,当我们在传出的mutator(IMutateOutgoingTransportMessages)中时,ClaimsPrincipal.Identity并不包含所有声明。只有名字。但是如果我在“Bus.Send”命令之前查看,我有正确的声明(组、权限等) 传出消息mutator驻留在一个外部类中,由我的主项目引用。下面是传出的mutator的代码:NServiceBus:传出消息转换器中的标识上下文,nservicebus,mutators,Nservicebus,Mutators,NServiceBus 4.4.0 嗨 我使用消息变异器进行非音素化。基本上,我在传出的mutator中序列化JWT令牌中的ClaimsPrincipal.Identity,并在传入的mutator中反序列化它,以将其添加到NServiceBus主机应用程序的主体中。(基于本文:)。问题是,当我们在传出的mutator(IMutateOutgoingTransportMessages)中时,ClaimsPrincipal.Identity并不包含所有声明。只有名字。但是如果我在“Bus.Send
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;
}
}
}
}