如何将方法参数插入自定义属性

本文关键字:插入 自定义属性 参数 方法 | 更新日期: 2023-09-27 18:32:59

我有一个名为 AuthoriseAttribute 的自定义属性,其构造函数如下所示:

public AuthoriseAttribute(int userId)
{
  .. blah
}

这是与称为GetUserDetails()的方法一起使用的,如下所示:

[Authorise(????????)]
public UserDetailsDto GetUserDetails(int userId)
{
  .. blah
}

在运行时,Authorise 属性的存在会导致执行某些需要用户 ID 的授权代码。显然,这可以从GetUserDetails()方法的参数中提取,但这意味着授权代码取决于方法的参数被赋予特定名称。

我希望能够将userId参数的实际值传递到属性中,以便授权代码与传递给属性的值(即不是方法参数)一起使用,其名称是已知的。

像这样的东西(不起作用):

[Authorise(userId)]
public UserDetailsDto GetUserDetails(int userId)
{
  .. blah
}

这样的事情可能吗?

如何将方法参数插入自定义属性

一种方法可以使用操作方法(而不是一般的属性)_in ASP.NET MVC_

执行此操作
public class CustomAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        int userId = (int)filterContext.ActionParameters["userId"];
    }
}

让 vcsjones 的评论成为答案,这是不可能的。

属性是元数据;它们在编译时编译到程序集中,在运行时不会更改。因此,传递到属性中的任何参数都必须是常量;文字、常量变量、编译器定义等。

一种方法是使属性成为AOP元素,使用PostSharp等框架或使用Unity框架等滚动自己的框架。这将允许您通过使用属性修饰方法来将"拦截器"附加到该方法,然后该属性将在属性中运行代码,并且还将确切地了解如何调用该方法,包括参数值。查看此博客:C-http://www.progware.org/Blog/post/Interception and-Interceptors-in-C-(面向方面编程).aspx

我能够使用以下方法解决此问题:

public class AuthorizeAttribute
{
    protected bool RequireIdClaim { get; private set; }
    public AuthorizeAttribute(bool requireIdClaim = false)
    {
        RequireIdClaim = requireIdClaim;
    }
    public Authorize() 
    {
        //regular auth stuff here
        if (RequireIdClaim)
        {
            var routeData = context.ActionContext.Request.GetRouteData();
            var requiredIdClaim = Convert.ToInt32(routeData.Values["id"]); 
            //Check here if their user profile has a claim to that Id
        }
    }
}

然后在您要检查 Id 的特定方法上,

[HttpGet]
[Route("{id}")]
[Authorize(requireIdClaim: true)]
public UserDetailsDto GetUserDetails(int userId)
{
    .. blah
}

如果您不关心检查他们的ID,而只是检查他们经过身份验证

[HttpGet]
[Route("")]
[Authorize]
public bool isLoggedIn()
{
    .. blah
}

当然,您可以随心所欲地组织授权过程,但这个想法允许您在那里的身份验证过程中获取他们的 ID,因为它是作为路由数据传入的。更多在这里: https://stackoverflow.com/a/16054886

可能是因为这是一个旧帖子,但现在这是可能的

[MyAttribute(MyAttributeVar= "myMethodVar")]
public void MyMethod(int myMethodVar)