簡體   English   中英

如何將方法參數插入自定義屬性

[英]How to plug method parameters into custom attribute

我有一個名為 AuthoriseAttribute 的自定義屬性,其構造函數如下所示:

public AuthoriseAttribute(int userId)
{
  .. blah
}

這與名為GetUserDetails()的方法一起使用,如下所示:

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

在運行時,Authorize 屬性的存在會導致執行一些需要用戶 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 框架等滾動你自己的框架。這將允許你通過用屬性裝飾它來將“攔截器”附加到方法,然后它將在屬性中運行代碼,並且還將了解該方法的確切調用方式,包括參數值。 查看此博客: 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM