【发布时间】:2011-03-15 10:57:46
【问题描述】:
我们正在使用自定义主体和身份类型 (ProdigyPrincipal/ProdigyIdentity),因为我们需要在我们的程序和服务中提供额外信息。在程序中我们设置了主体和身份。与 WCF 服务通信时,设置了主体和标识,但在转换为我们自己的类型后,主体和标识为空。
我注意到在调试模式和单元测试模式下运行是有区别的。在调试模式下,主体和身份的类型是 WindowsPrincipal 和 WindowsIdentity 类型。在单元测试模式下,类型是 GenericPrincipal 和 GenericIdenity。在这两种情况下,当转换为自定义类型时,值都是 null。
主体/身份的设置和获取是通过Thread.CurrentPrincipal完成的。 在绑定部分的 App.configs 中,安全模式设置为“传输”。
用于设置/获取主体和身份的函数:
protected static bool SetProdigyPrincipal()
{
#region require Thread.CurrentPrincipal should not be null
if (Thread.CurrentPrincipal == null) // OK
{
throw new InvalidOperationException("SetProdigyPrincipal(): Thread.CurrentPrincipal should not be null");
}
#endregion require Thread.CurrentPrincipal should not be null
var prodigyPrincipal = Thread.CurrentPrincipal as ProdigyPrincipal;
#region require prodigyPrincipal should not be null
if (prodigyPrincipal == null) // NOT OK
{
throw new InvalidOperationException("SetProdigyPrincipal(): prodigyPrincipal should not be null");
}
#endregion require prodigyPrincipal should not be null
// Get the Windows identity from the current principal
var prodigyIdentity = Thread.CurrentPrincipal.Identity as ProdigyIdentity;
#region require windowsIdentity should not be null
if (prodigyIdentity == null) // NOT OK
{
throw new InvalidOperationException("SetProdigyPrincipal(): prodigyIdentity should not be null");
}
#endregion require windowsIdentity should not be null
// Create new instance of Prodigy principal
var newProdigyPrincipal = new ProdigyPrincipal(prodigyIdentity);
#region require prodigyPrincipal should not be null
if (prodigyPrincipal == null)
{
throw new InvalidOperationException("SetProdigyPrincipal(): prodigyPrincipal should not be null");
}
#endregion require prodigyPrincipal should not be null
// Set the prodigy principal
var principalIsSet = ProdigyPrincipal.SetCurrentPrincipal(newProdigyPrincipal, ProdigyService.EnterpriseServiceBus);
// Return principal is set status
return principalIsSet;
}
有谁知道为什么无法从 Thread 中检索到自定义主体和身份类型?
亲切的问候,汉斯
【问题讨论】:
标签: multithreading wcf identity principal