如何在运行时更改Authorize属性的参数

时间:2013-09-19 10:16:42

标签: c# asp.net-mvc

有没有办法在运行时更改属性的参数? 我有一项服务,我在其中分配可以访问该服务的角色。我想在运行时分配这些角色。

  [HttpGet]
   [Authorize(Roles="admin")]
    public DataTable GetAllProducts()
    {
        FormToken auth = new FormToken();
        DataTable dt = new DataTable();
        if (!auth.isAuthenticated())
        {
            dt.Columns.Add("Error");
            DataRow dr = dt.NewRow();
            dr["Error"] = "Login to get the Service";
            dt.Rows.Add(dr);
            return dt;
        }
        var rec = from log in db.Products select log;
        return rec.ToDataTable();

3 个答案:

答案 0 :(得分:1)

的Vivek,

可以继承authorize属性,您可以覆盖OnAuthorize方法。像下面的东西。

public sealed class AuthorizationAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        //do custom authorization here
        base.OnAuthorization(filterContext);
    }
}

此时,您可以执行任何您希望授权的操作。您可以添加自定义构造函数来设置自己的变量。例如,我目前使用此覆盖来检测用户是否已获得授权,并且他们可以访问特定位置。

干杯

答案 1 :(得分:1)

@Nico提出的方法可行。

可以提供更好的封装和灵活性的替代方案是使用ClaimsPrincipalPermissionAttribute而不是AuthorizeAttribute。这是WIF的一部分,理论上它是.Net中身份和授权的首选框架。

在此模型中,ClaimsPrincipalPermissionAttribute根据资源和操作指定请求的授权上下文 - 即描述请求,而不是谁可以访问请求。< / p>

然后将实际授权逻辑封装在给定当前用户主体和授权上下文的自定义ClaimAuthorizationManager中。它的工作纯粹是进行授权检查。可以通过应用程序web.config文件中的配置来控制ClaimAuthorizationManager

这就是这里所描述的

http://msdn.microsoft.com/en-us/library/system.identitymodel.services.claimsprincipalpermissionattribute.aspx

虽然我更喜欢这种方法,但我认为非常强有理由偏爱另一种方法。我认为这种方法的优点是:

  • 它提供更好的封装
  • 更灵活
  • 它由CLR而不是MVC框架调用,这意味着它将通过单元测试或调用装饰方法的任何地方调用
  • 它可以强制使用,也可以声明性地使用(ClaimsPrincipalPermission.CheckAccess("Customer","Add"))
  • 似乎更符合微软的发展方向

缺点是

  • 仅限.Net 4.5。如果您使用的是.Net 3.5或4,则必须使用早期版本的WIF。它与.Net 4.5版本非常相似(但不完全相同)。名称空间为Microsoft.IdentityModel,而不是System.IdentityModel

正如我所说,在我看来,这主要是一个偏好问题。

答案 2 :(得分:0)

对于非声明性用户权限验证,您可能需要考虑使用System.Security.Permissions.PrincipalPermission而不是AuthorizeAttribute。这将允许您在运行时指定目标角色。根据您的身份验证方式,您可能需要确保将经过身份验证的用户主体分配给Thread.CurrentPrincipal PrincipalPermission使用的HttpContext.Current.User,而不是AuthorizeAttribute(这是什么) MVC {{1}}使用)。