asp.net mvc应用程序的Specialized Authorize属性

时间:2009-11-27 09:31:04

标签: c# asp.net asp.net-mvc attributes

我们正在尝试为Asp.Net MVC创建更具体的[授权]属性

 [AttributeUsage(AttributeTargets.All)] 
    public class AuthoriseUser : System.Attribute
    {
        public AuthoriseUser(string PermRequest)
        {
            //Do Some Auth.
        }
    }

我们称之为,

[AuthoriseUser("CanViewRoles")]

但调试函数时从不调用。

现在我们显然做了一些非常错误的事情,我见过PostSharp但是由于项目的性质我无法使用它。我怎样才能使用.Net实现这一目标?

4 个答案:

答案 0 :(得分:4)

您不需要从AuthorizeAttribute派生您的课程吗?见Custom Authorization in the ASP.NET MVC Framework and Authorize Attribute

答案 1 :(得分:3)

属性用于“装饰”方法/属性/类,以便您可以为该方法提供额外/额外的含义。

通过使用某个属性修饰方法,这并不意味着只要调用该方法就会执行'attribute'。 如果你想要这种行为,你确实需要看一下代码编织器,比如像PostSharp一样,将额外的代码编织到你用属性装饰的方法/属性中。

答案 2 :(得分:2)

.NET中的属性用于装饰类或方法,但您需要编写代码来请求此信息。例如,要验证是否使用自定义属性修饰了类,可以使用以下内容:

var attributes = (AuthoriseUser[])typeof(YourType)
    .GetCustomAttributes(typeof(AuthoriseUser), true);

然后,您可以阅读与此属性关联的元数据。

答案 3 :(得分:0)

属性不适用于扮演功能角色。您需要使用项目中某处的反射来编写代码,该反射读取类[和道具,方法等]的类型 - 元数据并查找应用于它的属性。根据应用的属性,您可以在运行时决定如何处理该属性。通常,这是在库的基类中完成的。

作为我们项目中的一个例子,我们有一个名为'Searchable'的属性。此属性应用于需要包含在搜索中的业务对象的属性。当客户端调用Search方法时,我们过滤掉所有使用Searchable属性修饰的道具,然后构造查询以对数据库进行搜索。实际上我们在SearchableAttribute类中没有任何与搜索功能相关的代码 - 实际上SearchableAttribute类中根本没有代码。

示例代码:

<强> SearchableAttribute

/// <summary>
/// Holds mapping information of searchable fields of business objects.
/// </summary>
[global::System.AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public sealed class SearchableAttribute : Attribute
{
    /// <summary>
    /// Initializes a new instance of the SearchableAttributeAttribute class.
    /// </summary>
    public SearchableAttribute()
    {
    }
}

业务对象基类

中的方法
    /// <summary>
    /// Provides collection of all Searchable Fields.
    /// </summary>
    /// <returns>DataField collection</returns>
    public IQueryable<DataField> GetSearchableDataFields()
    {
        PropertyInfo[] properties =
            this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

        var entityFields = from PropertyInfo property in properties
                           where property.GetCustomAttributes(typeof(SearchableAttribute), true).Length > 0
                           select
                               new DataField(
                                   property,
                                   (SearchableAttribute)property.GetCustomAttributes(typeof(SearchableAttribute), true)[0]);

        return entityFields.AsQueryable();
    }