Получение пользовательского атрибута для класса веб-страницы (.net) - PullRequest
1 голос
/ 20 января 2010

Я создал пользовательский атрибут для своих веб-страниц ... В созданном мною классе базовой страницы я пытаюсь проверить, был ли установлен этот атрибут. К сожалению, он не возвращается как часть функции GetCustomAttributes. Только если я явно использую typeof (myclass) для создания класса. У меня такое ощущение, что это связано с тем, как создаются классы asp.net. Кто-нибудь есть какие-либо предложения о том, как заставить это работать?

namespace SecuritySample.SecurityCode
{
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
public sealed class MHCSecurityAttribute : Attribute
{
    private string _permissionSet;
    private bool _viewable;

    public MHCSecurityAttribute(string permission, bool viewable)
    {
        _permissionSet = permission;
        _viewable = viewable;
    }

    public string PermissionSetRequired
    {
        get { return _permissionSet;  }
    }

    public bool Viewable
    {
        get { return _viewable; }
    }
  }
}

AdminOnly класс

using System;
using SecuritySample.SecurityCode;

namespace SecuritySample
{
[MHCSecurityAttribute("testpermission", false)]
public partial class AdminOnlyPage : BasePage, IMHCSecurityControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public void DisableControl()
    {
        Server.Transfer("Error.aspx");
    }

    public void EnableControl()
    {
    }
  }
}

Класс BasePage

using System.Web.UI.WebControls;

namespace SecuritySample.SecurityCode
{
public class BasePage : Page
{
    private string _user;

    protected override void OnLoadComplete(EventArgs e)
    {
        base.OnLoadComplete(e);

        _user = string.Empty;
        if (Session.Contents["loggedInUser"] != null)
            _user = Session["loggedInUser"].ToString();

        // perform security check

        // check page level
        if (this is IMHCSecurityControl)
        {
            System.Reflection.MemberInfo info = this.GetType();
            object[] attributes = info.GetCustomAttributes(false);
            bool authorized = false;

            if ((attributes != null) && (attributes.Length > 0))
            {
                foreach(MHCSecurityAttribute a in  attributes)
                {
                    if ((MHCSecurityCheck.IsAuthorized(_user, a.PermissionSetRequired)))
                    {
                        ((IMHCSecurityControl) this).EnableControl();
                        authorized = true;
                        break;
                    }
                }

                if (!authorized)
                    ((IMHCSecurityControl)this).DisableControl();
            }
        }
      }
    }
 }

1 Ответ

1 голос
/ 20 января 2010

Вы установили для AttributeUsage .Inherited элемент значение false. Если установлено значение false, атрибут не наследуется классами, которые наследуются от вашего класса (именно так страницы / элементы управления работают в ASP.NET). Вот почему, когда вы явно используете typeof (имя вашего класса), атрибут найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...