[英]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.