0

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

  [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();
4

3 回答 3

2

维维克,

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

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

此时,您可以为授权做任何您想做的事情。您可以添加自定义构造函数来设置自己的变量。例如,我目前使用此覆盖来检测用户是否被授权并且他们是否有权访问特定位置。

干杯

于 2013-09-19T11:05:42.810 回答
1

@Nico 提出的方法将起作用。

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

在这个模型中,根据资源和操作ClaimsPrincipalPermissionAttribute指定请求的授权上下文——也就是说,它描述了请求,而不是谁可以访问它。

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

这都在这里描述

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.IdentityModelSystem.IdentityModel

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

于 2013-09-19T11:25:37.700 回答
0

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

于 2013-09-19T11:55:59.780 回答