自定义属性方法级别授权

时间:2011-04-28 15:16:58

标签: c# custom-attributes

我正在尝试使用自定义属性来实现授权权限以执行方法。这就是我现在所拥有的(我只是开始使用自定义属性):

[RequiredUserPermissions(UserPermissions.CanLoginViaSite)]
internal static bool HasDesiredPermissions()
{   
    //Execute body here if the attribute decorated permissions exist
    //for current user tracked as this._user (with permissions as
    //this._user.UserPermissions (of type UserPermissions (an enum))
}

//Custom attribute class
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
internal sealed class RequiredUserPermissionsAttribute : Attribute
{
    private readonly UserPermissions _requiredPermission;

    public RequiredUserPermissionsAttribute(UserPermissions requiredPermission)
    { this._requiredPermission = requiredPermission; }

    public UserPermissions RequiredPermissions
    { get { return _requiredPermission; } }
}

我在stackoverflow上找到的最接近的问题是Using an attribute to prematurely return from a method。如果我使用asp.net mvc框架,答案本来是完美的,但不幸的是我现在正在使用WCF服务并且实现整个授权层超出我现在拥有的简单数据库登录(通过WCF方法调用)不是从时间轴的角度来看,现在是可行的。

我相信PostSharp可能是最好的选择,但现在又不是一个可行的选择。我被困在这里吗?我是否应该通过采用枚举和返回布尔值的方法再回过头来做这件事。我很乐意学习详细/复杂的东西,如果它能让我通过自定义的attiributes实现这个功能。

对我如何解决这个问题的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

我不知道它是否适用于您的情况,但如果您正在编写WCF服务,为什么不直接从框架使用角色基础授权?它既可以是角色,也可以是基于声明的,对于最简单的情况,您可以通过属性来定义它。 可以通过Custom Principal或仅使用框架中定义的标准角色提供程序来定义角色。

[PrincipalPermission(SecurityAction.Demand, Role = 'LoginViaSiteVisitors')]
internal static bool HasDesiredPermissions()
{
   //....
}