2010-11-18 14 views

Respuesta

4

Puede configurar esto en web.config con el elemento de autorización.

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

Básicamente grupos de dominio se traducen en papeles utilizando <authentication mode="Windows" />. Puede read more about it on MSDN

+0

bien Tengo que. Pero, ¿hay alguna manera de restringir el acceso a un nivel de método específico similar a cómo puede hacerlo con MVC? –

+0

@Blair Jones, tengo que hacer una comprobación como 'if (User.IsInRole (" somerole "))' dentro del método, me temo. –

+0

ok gracias ... eso es a lo que le tenía miedo :( –

3

Sé que esta es una publicación anterior, pero pensé que compartiría mi experiencia ya que acabo de pasar por esto. No quería usar web.config. Estaba buscando una forma de crear un atributo para formularios web similar a la implementación de MVC. Encontré una publicación por Deran Schilling que utilicé como base para la porción del atributo.

creé una costumbre IPrincipal

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

y el director

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; } 
    } 
} 

y creó un atributo para el uso en la página

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

y crearon algunas excepciones personalizadas

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) { } 
} 

y ahora puedo aplicar el atributo para el uso en una página determinada

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

No creo que este sea un muy buen ejemplo, me temo. Hay código en el constructor del atributo, en .NET no tienes control sobre cuándo los atributos están instanciados. Además, podrían almacenarse en caché. Esto significa que HttpContext en el que está confiando en su código para las credenciales del usuario podría no ser el contexto que usted cree que es. Esto puede funcionar en algunos casos de prueba, pero tiene la posibilidad de fallar en formas que podría no esperar. – AlexC

+2

@AlexC ¿tiene alguna alternativa para este código? (formularios web) –

+0

este código no funciona en WebForms, no arroja ningún HttpExceptions. –

Cuestiones relacionadas