2010-11-18 8 views

risposta

4

È possibile impostare questo in web.config con l'elemento di autorizzazione.

<configuration> 
    <system.web> 
    <authorization> 
     <allow roles="domainname\Managers" /> 
     <deny users="*" /> 
    </authorization> 
    </system.web> 
</configuration> 

Fondamentalmente gruppi di dominio sono convertiti in ruoli utilizzando <authentication mode="Windows" />. È possibile read more about it on MSDN

+0

destra che ho avuto. Ma esiste un modo per limitare l'accesso a un livello di metodo specifico simile a come è possibile farlo con MVC? –

+0

@Blair Jones, dovrai fare un controllo come 'if (User.IsInRole (" somerole "))' nel metodo, temo. –

+0

ok grazie ... questo è quello di cui avevo paura :( –

3

So che questo è un vecchio post ma ho pensato di condividere la mia esperienza come ho appena passato attraverso questo. Non volevo usare web.config. Stavo cercando un modo per creare un attributo per i webform simili all'implementazione di MVC. Ho trovato un post di Deran Schilling che ho usato come base per la parte dell'attributo.

ho creato una consuetudine IPrincipal

interface IMyPrincipal : IPrincipal 
{ 
    string MyId { get; } 
    string OrgCode { get; } 
    string Email { get; } 
} 

e Principal

public class MyPrincipal : IMyPrincipal 
{ 
    IIdentity identity; 
    private List<string> roles; 
    private string email; 
    private string myId; 
    private string orgCode; 

    public MyPrincipal(IIdentity identity, List<string> roles, string myId, string orgCode, string email) 
    { 
     this.identity = identity; 
     this.roles = roles; 
     this.myId = myId; 
     this.orgCode = orgCode; 
     this.email = email; 
    } 

    public IIdentity Identity 
    { 
     get { return identity; } 
    } 

    public bool IsInRole(string role) 
    { 
     return roles.Contains(role); 
    } 

    public string Email 
    { 
     get { return email; } 
    } 
    public string MyId 
    { 
     get { return myId; } 
    } 
    public string OrgCode 
    { 
     get { return orgCode; } 
    } 
} 

e ha creato un attributo per l'utilizzo sulla pagina

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class AdminAuthorizationAttribute : Attribute 
{ 
    public AdminAuthorizationAttribute() 
    { 
     var user = (MyPrincipal)HttpContext.Current.User; 

     if (user.IsInRole("MyAdmin")) 
      return; 

     throw new AccessDeniedException(); 
    } 
} 

e ha creato alcune eccezioni personalizzate

public class AccessDeniedException : BaseHttpException 
{ 
    public AccessDeniedException() : base((int)HttpStatusCode.Unauthorized, "User not authorized.") { } 
} 

public class BaseHttpException : HttpException 
{ 
    public BaseHttpException(int httpCode, string message) : base(httpCode, message) { } 
} 

e ora posso applicare l'attributo per l'utilizzo su una determinata pagina

[AdminAuthorization] 
public partial class Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
} 
+2

Non credo che questo sia un buon esempio, ho paura. C'è del codice nel costruttore dell'attributo, in .NET non hai controllo su quando gli attributi vengono istanziati e possono anche essere memorizzati nella cache, il che significa che HttpContext su cui si basa il proprio codice per le credenziali dell'utente potrebbe non essere il contesto che si pensa sia. Può funzionare su alcuni casi di test ma ha la possibilità di non riuscire in modi che potresti non aspettarti – AlexC

+2

@AlexC hai un'alternativa per questo codice? (webforms) –

+0

questo codice non funziona in WebForms, non getta alcuna HttpException. –

Problemi correlati