2015-06-29 22 views
8

Bir ASP.Net uygulamasının arka planında çalışmak için, How to run Background Tasks in ASP.NET numaralı yazara dayanarak, numaralı blog yayınını kullanarak HostingEnvironment.QueueBackgroundWorkItem10 kullanıyorum.Kullanıcı Kimliği ile QueueBackgroundWorkItem Kullanılsın mı?

Arka plan görevini geçerli kullanıcı kimliğiyle çalıştırmak istiyorum. Bir WindowsPrincipal geçirmeyi ve Thread.CurrentPrincipal'ı eylemde ayarlamayı denedim, ancak bu işlem geçerli kullanıcı olarak yürütülmesine neden olmadı.

Bu olanaklı mıdır, yoksa HostingEnvironment'ı kullanmak her zaman Uygulama havuzu kimliği olarak çalışıyor?

Düzenleme Tam olarak benim asıl soruya noktada, ama ben de CallContext.LogicalSetData() ve CallContext.LogicalGetData() üzerinden bir değer geçmek çalıştı. Get tarafında, değer her zaman boş.

Düzenleme # 2

Ayrıca kuyruk tarafında bu çalıştı: eser aslında yapılır

using (HostingEnvironment.Impersonate(windowsIdentity.Token)) 
{ 
    HostingEnvironment.QueueBackgroundWorkItem(work); 
} 

Eylem mevcut WindowsIdentity hala uygulama havuzu kimliktir.

+2

Dokümanlar, "Bu aşırı yüklenmiş yöntem, arayandan gelen aramaya ExecutionContext veya SecurityContext akışını akıtmaz. Bu nedenle, CurrentPrincipal özelliği gibi bu nesnelerin üyeleri arayandan arayan kişiye akmaz." https://msdn.microsoft.com/en-us/library/system.web.hosting.hostingenvironment.queuebackgroundworkitem(v=vs.110).aspx –

cevap

0

Herhangi bir sebep neden "HostingEnvironment" kullanmanız gerekir?

veya WindowsImpersonationContext'i kullanmaya çalıştınız mı?

System.Security.Principal.WindowsImpersonationContext impersonationContext; 
impersonationContext = 
    ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate(); 

//Insert your code that runs under the security context of the authenticating user here. 

impersonationContext.Undo(); 

öğrenebilirsiniz onu here

+0

Sorudaki bağlantıda ne yaptığının açıklamasına bakın. AppDomain kapatmaya çalıştığında iş parçacığının öldürülmesini engellemek için olduğu gibi programlanmalıdır. –

0

geçerli kullanıcının kimlik isteğini iplik işlemesi takılır yapmak, ve bu istek ömrü boyunca geçerlidir nasıl daha fazlası. Çalışan işlevinize HttpContext.Current.User.Identity referansını iletmiş olsanız bile, kullanmaya çalıştığınızda artık geçerli olmayabilir. Anlayabildiğim kadarıyla, arka plan görevinizde kullanabileceğiniz yeni bir WindowsIdentity yapmak için kimlik belirtecini klonlamak için Windows API ile biraz çalışma yapmanız gerekir. Böyle Yani bir şey:

IntPtr copy = IntPtr.Zero, 
    token = ((WindowsIdentity)HttpContext.Current.User.Identity).Token; 
if (DuplicateToken(token, ref copy)) // the WinAPI function has more parameters, this is a hypothetical wrapper 
{ 
    return new WindowsIdentity(copy); 
} 
// handle failure 

Geçiş arka plan görevine bu WindowsIdentity ve gerektiğinde bunu taklit. Atmayı unutma.