2009-07-09 6 views
19

Comment tester un code de test décoré avec l'attribut PrincipalPermission?MSTEST PrincipalPermission

Par exemple, cela fonctionne:

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."); 
    } 
} 

Cela jette un SecurityException:

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

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

Toutes les idées?

+0

Intéressant ... J'ai couru le même test avec TestDriven et il est passé. Dans ce cas, le test semblait fonctionner comme moi, mais lorsque le test a été exécuté avec mstest, CurrentPrincipal avait une identité «vide». Quelqu'un sait-il pourquoi? –

Répondre

19

Que diriez-vous de créer un GenericIdentity et attachant que le Thread.CurrentPrincipal dans votre test comme ceci:

[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(); 
} 

Pour un échec test, vous pouvez:

[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

Cela a fonctionné, Ray, Merci! Mais il semblait trop facile de faire semblant. Quelqu'un ne pourrait-il pas prétendre avoir le rôle requis? –

+0

Cool! Heureux de vous aider! C'est aussi simple que ça dans un contexte de confiance totale. La définition de privilèges spéciaux Thread.CurrentPrincipal requiert spécifiquement SecurityPermission de SecurityPermissionFlag.ControlPrincipal. Voir le livre de Keith Brown en ligne: http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsThreadDotCurrentPrincipal.html –

+0

Article très intéressant! Mais je n'ai aucun moyen de savoir ou de contrôler si mes utilisateurs ont ou non l'autorisation de sécurité pour changer CurrentPrincipal. Heureusement, mon application est un service WCF que je devine (et j'espère), comme le timer et le pool thead, ne propagera pas CurrentPrincipal. –

1

Vous pouvez essayer impersonating différents utilisateurs dans la méthode de test, si vous exécutez le code en tant qu'administrateur, vous pouvez créer un compte d'utilisateur local dans le test (ou la classe de test) et le supprimer à la fin. Désolé, j'ai imaginé utiliser l'emprunt d'identité pour tester un cas d'échec - j'aurais dû lire votre question correctement :) J'ai des tests unitaires similaires, et ils sont capables de créer des comptes locaux dans mstest. Que ce soit une bonne pratique est une autre question.

Je vois que vous avez déjà fait comme this page suggère: définissez la politique principale du domaine app à "WindowsPrincipal". Pour moi, Thread.CurrentPrincipal.Identity.Name donne mon nom d'utilisateur et le test passe en utilisant VS 2005 et VS 2008 ciblant .NET 2.0, 3.0 & 3.5.

Courez-vous sur Vista/Win7 avec UAC et VS non élevé? Sinon, êtes-vous capable de reprographier sur une autre machine, en utilisant un autre groupe ou en créant un autre compte administrateur local sur votre machine et en exécutant les tests en tant que cet utilisateur?

+0

Lorsque j'exécute le test, CurrentPrincipal a un GenericIdentity non authentifié, donc je ne crois pas que le code de test pourrait créer ou supprimer un compte local. –

+0

Je cours VS sur XP en tant qu'administrateur. La suggestion de Ray a fonctionné, mais m'a laissé avec d'autres soucis de sécurité. Voir les commentaires que j'ai laissés Ray. –

Questions connexes