2013-09-06 2 views
10

Sto lavorando su un sito Web semplice in asp.net. Vorrei limitare l'accesso al lato, in modo che solo gli utenti in un gruppo AD specifico è consentito. L'ho fatto e sta funzionando bene. Ma quando un utente che non fa parte del gruppo AD tenta di accedere al sito, riceve una richiesta di accesso. Come reindirizzare l'utente non autorizzato a una pagina personalizzata, anziché ottenere il prompt di accesso?Reindirizzare gli utenti non autorizzati asp net

Di seguito è il mio web.config. La parte più bassa del codice, è qualcosa che ho provato ma non ha funzionato.

<configuration> 
<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <authentication mode="Windows"/> 
    <authorization> 
    <allow roles="DOMAIN\GROUP"/> 
    <deny users="*"/> 
    </authorization> 
</system.web> 

<location path="AccessDenied.aspx"> 
<system.web> 
<authorization> 
    <allow users="*"/> 
</authorization> 
</system.web> 
</location> 
</configuration> 

ho aggiunto questo ai Global.asax.cs:

protected void Application_EndRequest(Object sender, EventArgs e) 
    { 
     if (HttpContext.Current.Response.Status.StartsWith("401")) 
      { 
       HttpContext.Current.Response.ClearContent(); 
       Server.Execute("AccessDenied.aspx"); 
      } 
} 

Tutte le idee?

MODIFICA: Ho provato alcune delle soluzioni pubblicate, ma non hanno funzionato. Ma ho preso a lavorare con questo codice:

void Application_EndRequest(object sender, System.EventArgs e) 
    { 
     if (((Response.StatusCode == 401) 
     && (Request.IsAuthenticated == true))) 
     { 
      Response.ClearContent(); 
      Response.Redirect("~/AccessDenied.aspx"); 
     } 
    } 
} 
+0

perché '': qualsiasi utente è autorizzato ad accedere, è necessario consentire un gruppo o utenti specifici. –

+0

Sì, per qualche motivo alcuni web.config non sono stati visualizzati. – mads

+0

'Propmt' significa pagina di errore gialla a destra ?? –

risposta

3

È possibile utilizzare Response.Redirect o Server.Transfer

Response.Redirect("AccessDenied.aspx"); 

esempio completa:

protected void Application_EndRequest(Object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Response.Status.StartsWith("401")) 
    { 
     HttpContext.Current.Response.ClearContent(); 
     Response.Redirect("AccessDenied.aspx"); 
    } 
} 
2

Supponendo che si desidera gestire tutti Errori "non autorizzati":

<customErrors defaultRedirect="Error.aspx" mode="On"> 
    <error statusCode="401" redirect="Unauthorized.aspx" /> 
    <error statusCode="403" redirect="Forbidden.aspx" /> 
</customErrors> 

Qualsiasi richiesta 401 (non autorizzata) verrà inoltrata a Unauthorized.aspx.

+2

Questo non funziona, anche se dovrebbe. Microsoft prende a volte decisioni interessanti nel loro design. –

+0

Ciò potrebbe non funzionare a causa del fatto che un '401 Non autorizzato' restituito da UrlAuthorizationModule viene convertito in un 'Reindirizzamento 302' da FormsAuthenticationModule: http://www.asp.net/web-forms/overview/older-versions- security/membership/user-based-authorization-cs – track0

0
<authorization> 
<!--<allow users="*"/>-->This here means allow everyone . 
<allow users="AD"/> -- Add this group to AD domain . 
<deny users="?"/> --Deny unknown users(Not authenticated) 
<allow roles="Admins"/> --If you have created roles .  

Se si dispone di gruppo locale che utilizzare <allow user ="AD"> ma è necessario registrarsi al dominio AD. <allow roles ="AD" /> funzionerà solo con i gruppi Domain AD non per i gruppi locali.

protected void Application_EndRequest(Object sender,EventArgs e) 

    { 
    HttpContext context = HttpContext.Current; 
    if (context.Response.Status.Substring(0,3).Equals("401")) 
    { 
     context.Response.ClearContent(); 
     //do redirect here 
    } 
    } 
+0

'allow user' è per i nomi degli account utente, non per i gruppi di annunci. – Nicholas

+0

@Nicholas Se potessi semplicemente controllare questa affermazione 'Se hai un gruppo locale che usi ma devi registrarlo al dominio AD. funzionerà solo con i gruppi Domain AD non per i gruppi locali."Questa affermazione potrebbe essere fonte di confusione e portare i lettori in un'altra direzione. Potrei cambiarlo con parole migliori fino ad allora, grazie per aver segnalato, ma non sto dicendo che un utente' 'allow 'è per Active Directory '. –

+0

Se si utilizza 'permetti ruoli' e si imposta il gestore ruoli su' WindowsTokenRoleProvider', esso rileverà sia i gruppi di computer locali che i gruppi di sicurezza del dominio se il server è un membro del dominio. Vedere https://msdn.microsoft.com/en-us/library/wce3kxhd%28v=vs.100%29.aspx – Nicholas

1

ho avuto più successo con questo:

 // This is a workaround for the fact that we are not using MVC and its attributes 
     // This is the situation where a user is logged in - but not authorized for this page 
     void Application_EndRequest (object sender, System.EventArgs e) 
     { 
     if (((Response.StatusCode == 302) && (Request.IsAuthenticated == true))) 
     { 
      try 
      { 
       string sLoc = Response.Headers ["Location"]; 
       if (sLoc.Contains ("Login")) 
       { 
        Response.ClearContent(); 
        Response.Redirect ("~/AccessDenied.aspx"); 
       } 
      } 
      catch 
      { 
      } 
     } 
     }