2014-07-22 12 views
9

All'interno di un HttpModule, a seguito di una riscrittura URL, sto sto testando autorizzazioni utente ad un ad un percorso virtuale situato all'interno della mia applicazione usando:Come testare le autorizzazioni utente per la directory virtuale?

// Since we are now rewriting the path we need to check again that the 
// current user has access to the rewritten path. 
// Get the user for the current request 
// If the user is anonymous or authentication doesn't work for this suffix 
// avoid a NullReferenceException in the UrlAuthorizationModule by creating 
// a generic identity. 
string virtualCachedPath = cache.GetVirtualCachedPath(); 

IPrincipal user = context.User ?? new GenericPrincipal(
    new GenericIdentity(string.Empty, string.Empty), new string[0]); 

// Do we have permission to call 
// UrlAuthorizationModule.CheckUrlAccessForPrincipal? 
PermissionSet permission = new PermissionSet(PermissionState.None); 
permission.AddPermission(
new AspNetHostingPermission(AspNetHostingPermissionLevel.Unrestricted)); 
bool hasPermission = 
permission.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet); 
bool isAllowed = true; 

// Run the rewritten path past the auth system again, using the result as 
// the default "AllowAccess" value 
if (hasPermission && !context.SkipAuthorization) 
{ 
    isAllowed = UrlAuthorizationModule.CheckUrlAccessForPrincipal(
             virtualCachedPath, user, "GET"); 
} 

Dove virtualCachedPath è qualsiasi percorso virtuale per esempio ~/app_data/cache situato con la radice l'applicazione.

http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal(v=vs.110).aspx

Questo, tuttavia, genera un ArgumentException ma se testati contro una directory virtuale esterna.

[ArgumentException: percorso virtuale esterno all'applicazione corrente non supportato. Nome parametro: virtualPath]

Ad es

Example virtual directory in IIS

Qual è il metodo corretto per verificare il permesso all'utente di una directory virtuale?

risposta

2

Sono in grado di utilizzare con successo il metodo UrlAuthorizationModule.CheckUrlAccessForPrincipal per verificare l'accesso ai file che risiedono in una directory esterna, che viene mappata come una directory virtuale, quando il percorso che viene passato a CheckUrlAccessForPrincipal è un URL formattato percorso relativo ("~/PATH"). Se invece passo il percorso fisico usando le convenzioni del file system ("C: \ PATH \"), ottengo lo ArgumentException che descrivi.

Quindi ho il sospetto che il virtualCachedPath possa effettivamente essere un percorso in formato file system, almeno nelle istanze in cui viene sollevata l'eccezione. Vorrei raccomandare che si implementa la registrazione nella vostra applicazione in modo da poter controllare due volte il valore di virtualCachedPath quando che viene sollevata un'eccezione:

try 
{ 
    isAllowed = UrlAuthorizationModule.CheckUrlAccessForPrincipal(virtualCachedPath, user, "GET"); 
} 
catch (ArgumentException ex) 
{ 
    Trace.TraceInformation("VirtualCachedPath: {0}", virtualCachedPath); 
    throw; 
} 
+0

Hai assolutamente ragione. Il metodo che stavo usando per determinare il percorso non era corretto. –

Problemi correlati