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)
{
}
}
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? –
@Blair Jones, dovrai fare un controllo come 'if (User.IsInRole (" somerole "))' nel metodo, temo. –
ok grazie ... questo è quello di cui avevo paura :( –