[.NET] CredentialCache in een IIS hosted remote object

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:58
Ik heb een remoted object dat in IIS gehost is. Dat object voert een aantal taken uit op een andere thread.
Eén van die taken is het uploaden van een file naar een Sharepoint Server. Om dit te kunnen bewerkstelligen, heb ik credentials nodig. Deze kan ik verkrijgen door gebruik te maken van
code:
1
CredentialCache.DefaultCredentials


Echter, aangezien dat dit in een andere thread gebeurt, lukt dit niet. Als ik een nieuwe thread start in een asp.net applicatie (want dat is het nu in feite, aangezien m'n component in IIS gehost is), krijgt die thread niet dezelfde security context als de 'main thread'.
Als ik dus in die thread de credentials doorgeef, krijg ik altijd een '401 unauthorized' error.

Als ik die upload in de 'main' thread uitvoer, dan werkt het wel goed. Ik heb ook al geprobeerd om in de main thread de credentials op te vragen, en deze dan te gebruiken in die andere thread:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private ICredentials _cred;

public void StartTask()
{
     _cred = CredentialCache.DefaultCredentials;
     Thread t = new Thread (new ThreadStart (PerformAllSteps));
     t.Start();
}

private void PerformAllSteps()
{
      foreach( IStep s in tasks )
      {
           s.Execute (_cred);
      }
}


Echter, dit blijft een 401 unauthorized geven. Iemand enige logische verklaring waarom bovenstaande niet werkt, en, iemand een idee hoe ik dit zou kunnen oplossen ?
Die upload uit die andere thread halen, is geen optie.

https://fgheysels.github.io/


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

welke code gebruik je om die file te uploaden ?
heb je al eens ethereal over de communicatie gegooid ?

heb je al eens de System.Threading.Thread.CurrentPrincipal vergeleken in beide threads ?
misschien moet je aan impersonation gaan doen.

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:58
HIGHGuY schreef op vrijdag 10 februari 2006 @ 22:54:
welke code gebruik je om die file te uploaden ?
Dat doet er nu niet zo toe.
code:
1
2
3
WebClient c = new WebClient();
c.Credentials = ...
c.UploadFile (.... );
heb je al eens ethereal over de communicatie gegooid ?
Het gaat er gewoon om dat ik de credentials niet kan meegeven.
heb je al eens de System.Threading.Thread.CurrentPrincipal vergeleken in beide threads ?
Dit heb ik nog niet echt gedaan, maar die 2 zullen logischer wijs niet dezelfde zijn, aangezien een nieuwe thread die binnen een asp.net process gestart wordt, onder een andere security context draait.
Ik heb al geprobeerd om gebruik te maken van AppDomain.CurrentDomain.SetThreadPrincipal() maar dat werkt blijkbaar enkel in windows applicaties.
misschien moet je aan impersonation gaan doen.
Heb ik al gedaan, maar dit helpt ook niet.

https://fgheysels.github.io/


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

whoami schreef op zaterdag 11 februari 2006 @ 08:49:
[...]
Heb ik al gedaan, maar dit helpt ook niet.
binnen de worker thread ?

ik zou't anders ook niet direct weten...
misschien moet je met een security attribute meer permissie vragen...

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:58
misschien moet je met een security attribute meer permissie vragen...
Ook dat zal niet lukken, aangezien de worker thread onder een andere identity draait, die door asp.net wordt gegeven. Die kan ik blijkbaar zelf niet veranderen / controleren.
Ik heb de credentials nodig van Principal van de main -thread.

https://fgheysels.github.io/


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

heb je er enig ID van welke permissies een unmanaged thread dan zou krijgen ?

eventueel kun je een unmanaged thread maken (CreateThread) die een callback meekrijgt om jouw managed code op te roepen. smerige workaround (moest het werken) maar beter dat dan niets als je het zeker niet in je main thread wil.

andere mogelijkheid is misschien de threadpool met QueueUnsafeWorkItem (of iets gelijkaardigs).

Nogal een moeilijke opgave aangezien .NET 1.1 blijkbaar niet echt de functionaliteit bezit om dit zomaar te veranderen.

anderzijds bedenk ik net dat ASP.NET (IIS) mss wel security settings heeft voor threadpool threads.
Ik herinner me van deze vakantie dat ik daar wel iets ben tegengekomen qua thread security. misschien moet je je daar eens verder in verdiepen.

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:58
De currentprincipal in de main thread is dezelfde als die in de worker-thread.
Ik snap gewoon niet dat dit:
code:
1
2
3
WebClient c  = new WebClient();
c.Credentials = CredentialCache.DefaultCredentials;
c.UploadFile (...)

wel werkt in de main thread, maar niet in een worker - thread.

Zelfs als ik de DefaultCredentials in de main thread opvraag, en ze doorgeef aan de worker-thread werkt het niet.

https://fgheysels.github.io/

Pagina: 1