2009-07-09 13 views
19

In che modo il codice del test dell'unità è decorato con l'attributo PrincipalPermission?MSTEST PrincipalPermission

Per esempio, questo funziona:

class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
     var c = new MyClass(); 
    } 
} 

[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Users")] 
class MyClass 
{ 
    public MyClass() 
    { 
     Console.WriteLine("This works."); 
    } 
} 

Questo getta una SecurityException:

[TestClass] 
public class UnitTest1 
{ 
    [TestInitialize] 
    public void TestInitialize() 
    { 
     AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     var c = new MyClass(); 
    } 
} 

Tutte le idee?

+0

Interessante ... ho eseguito lo stesso prova con TestDriven e passa. In questo caso, il test è sembrato funzionare come me, ma quando il test è stato eseguito con maggiore precisione, CurrentPrincipal aveva un'identità "vuota". Qualcuno sa perché? –

risposta

19

ne dite di creare un GenericIdentity e allegando che al Thread.CurrentPrincipal nel test in questo modo:

[TestMethod] 
public void TestMethod1() 
{ 
    var identity = new GenericIdentity("tester"); 
    var roles = new[] { @"BUILTIN\Users" }; 
    var principal = new GenericPrincipal(identity, roles); 
    Thread.CurrentPrincipal = principal; 

    var c = new MyClass(); 
} 

Per un test fallire, si potrebbe:

[TestMethod] 
[ExpectedException(typeof(SecurityException))] // Or whatever it's called in MsTest 
public void TestMethod1() 
{ 
    var identity = new GenericIdentity("tester"); 
    var roles = new[] { @"BUILTIN\NotUsers" }; 
    var principal = new GenericPrincipal(identity, roles); 
    Thread.CurrentPrincipal = principal; 

    var c = new MyClass(); 
} 
+0

Questo ha funzionato, Ray, grazie! Ma sembrava troppo facile da fingere. Qualcuno potrebbe affermare di avere il ruolo richiesto? –

+0

Cool! Felice di aiutare! È così facile in un contesto di fiducia totale. L'impostazione di Thread.CurrentPrincipal richiede privilegi speciali, in particolare, è necessario SecurityPermission di SecurityPermissionFlag.ControlPrincipal. Vedi il libro di Keith Brown online: http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsThreadDotCurrentPrincipal.html –

+0

Articolo molto interessante! Ma non ho modo di sapere o controllare se i miei utenti hanno o meno il permesso di sicurezza per modificare CurrentPrincipal. Fortunatamente, la mia applicazione è un servizio WCF che sto indovinando (e sperando), come il timer e il pool, non propagherà il CurrentPrincipal. –

1

Si potrebbe provare impersonating utenti diversi nel metodo di prova, se si esegue il codice come amministratore è possibile creare un account utente locale all'interno del test (o classe di test) ed eliminarlo alla fine.

Edit: Scusa, ho immaginato utilizzando impersonare per testare un caso fallimento - Avrei dovuto leggere la tua domanda correttamente :) Ho test di unità simili, e sono in grado di creare account locali all'interno mstest. Se questa è una buona pratica è un'altra questione.

Vedo che hai già fatto come suggerisce la pagina this: imposta la politica principale del dominio dell'app su "WindowsPrincipal". Per me, Thread.CurrentPrincipal.Identity.Name fornisce il mio nome utente e le passate di test utilizzando VS 2005 e VS 2008 Targeting .NET 2.0, 3.0 & 3.5.

Sei in esecuzione su Vista/Win7 con UAC e VS non elevati? Altrimenti sei in grado di eseguire la repro su un altro computer, utilizzando un gruppo diverso o creando un altro account amministratore locale sul tuo computer e eseguendo i test come questo utente?

+0

Quando eseguo il test, CurrentPrincipal ha una GenericIdentity non autenticata, quindi non credo che il codice del test sia in grado di creare o eliminare un account locale. –

+0

Sto eseguendo VS su XP come amministratore. Il suggerimento di Ray ha funzionato, ma mi ha lasciato con altri problemi di sicurezza. Vedi i commenti che ho lasciato Ray. –