我有一个网站,其中包含几个源自PageBase类的aspx页面。例如,其中一个如下:
public partial class Pages_Home_Default : PageBase
{
}
在其中一些页面中,我想阻止访问UNLESS登录。我可以通过IsMember属性获取客户端是否登录到我的PageBase。
我想用attibutes来实现这个目标。例如:
[AuthenticationRequired(true)]
public partial class Pages_Home_Default : PageBaseList
{
}
[AttributeUsage(AttributeTargets.Class)]
public class AuthenticationRequired : Attribute
{
public AuthenticationRequired(bool isMemberRequired)
{
Value = isMemberRequired;
}
public bool Value { get; private set; }
}
并在PageBase例如:
protected override void OnPreInit(EventArgs e)
{
//Retrieve the AuthenticationRequired attribue value and if not authenticated Redirect client to a login page if logged in, continue displaying the page
}
我还发现这是为了获取和读取属性
System.Reflection.MemberInfo info = typeof(Pages_Home_Default);
object[] attributes = info.GetCustomAttributes(true);
但是当你想在BASE类而不是DERIVED类上做这件事时,这是不切实际的。
可以这样做吗?
非常感谢
答案 0 :(得分:2)
如果您使用的是MVC,那就有一个att - AuthorizeAttribute。
如果您使用WebForms,那么您不需要使用属性,您可以使用authorization元素从web.config控制此属性。
答案 1 :(得分:1)
为什么不在属性中检查它?
[AttributeUsage(AttributeTargets.Class)]
public class AuthenticationRequired : Attribute
{
public AuthenticationRequired(bool isMemberRequired)
{
if(isMemberRequired && !HttpContext.Current.User.Identity.IsAuthenticated)
{
FormsAuthentication.RedirectToLoginPage();
}
}
}
答案 2 :(得分:0)
确定。我将之前给出的代码与其他来源的简单行结合起来,这是我提出的代码:
[AttributeUsage(AttributeTargets.Class)]
public class AuthenticationRequired : Attribute
{
public AuthenticationRequired(bool isMemberRequired)
{
Value = isMemberRequired;
}
public bool Value { get; private set; }
}
public class Utility
{
public static T GetCustomAttribute<T>(Type classType) where T : Attribute
{
object Result = null;
System.Reflection.MemberInfo Info = classType;
foreach (var Attr in Info.GetCustomAttributes(true))
{
if (Attr.GetType() == typeof(T))
{
Result = Attr;
break;
}
}
return (T)Result;
}
}
public class PageBase : System.Web.UI.Page
{
protected override void OnPreInit(EventArgs e)
{
AuthenticationRequired AttrAuth = Utility.GetCustomAttribute<AuthenticationRequired>(this.GetType());
if (AttrAuth != null && AttrAuth.Value)
{
if(!IsMember)
HttpContext.Current.Response.Redirect("Membership.aspx");
}
}
}