4 回答

TA貢獻1804條經驗 獲得超3個贊
我能夠通過在AuthorizationHandlerContext
中使用來獲取 .NET Core 3.1 中的自定義屬性。ControllerActionDescriptor
private IEnumerable<TAttribute> GetAttributes<TAttribute>(AuthorizationHandlerContext authContext)
{
? ? if (authContext.Resource is RouteEndpoint routeEndpoint)
? ? {
? ? ? ? var actionDescriptor = routeEndpoint.Metadata.OfType<ControllerActionDescriptor>().SingleOrDefault();
? ? ? ? var attributes = actionDescriptor?.MethodInfo.GetCustomAttributes(typeof(TAttribute), false).Cast<TAttribute>();
? ? ? ? return attributes;
? ? }
? ??
? ? return null;
}

TA貢獻1829條經驗 獲得超7個贊
從 .net 5 開始,上下文是HttpContext
有GetEndPoint
方法擴展HttpContext
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TRequirement requirement)
{
? ? if(context is HttpContext httContext){
? ? ? ? var endpoint = context.GetEndPoint();
? ? } else {
? ? ? ? throw ... // let's see how things will move with next version of .net?
? ? }
}

TA貢獻1798條經驗 獲得超7個贊
有一個部分“在處理程序中訪問 MVC 請求上下文”,但這是錯誤的。
然而,在“反饋”下,他們的 2 個問題看起來與最有希望的答案相關,即將下面的代碼添加到AuthorizationHandler
.
這可以訪問controllerActionDescriptor
,但正如你所看到的,我已經查看了各種屬性,但沒有一個屬性給我當前的路由數據:
var controllerActionDescriptor = routeEndpoint.Metadata
? ? .OfType<ControllerActionDescriptor>()
? ? .SingleOrDefault();
if (controllerActionDescriptor != null)
{
? ? var a = controllerActionDescriptor.AttributeRouteInfo;
? ? var p = controllerActionDescriptor.Parameters;
? ? var ep = controllerActionDescriptor.EndpointMetadata;
? ? var r = controllerActionDescriptor.RouteValues;
}

TA貢獻1810條經驗 獲得超4個贊
我找到了解決方案,在ConfigureServices中將IHttpContextAccessor注冊到IOC中
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
然后在AttributeAuthorizationHandler中獲取
public class AccountLoginAuthorizeHandler : AttributeAuthorizationHandler<AccountLoginAuthorizationRequirement, AccountLoginAttribute>
{
private readonly IHttpContextAccessor _httpContextAccessor;
public PermissionAuthorizeHandler(IHttpContextAccessor httpContextAccessor, IZaabeeRedisClient redisClient,
IOptions<LoginConfig> loginConfig)
{
_httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AccountLoginAuthorizationRequirement requirement, IEnumerable<AccountLoginAttribute> attributes)
{
if (context.Resource is AuthorizationFilterContext filterContext)
{
var httpContext = _httpContextAccessor.HttpContext;
//Do Something
}
else
//Do Something
context.Succeed(requirement);
return Task.CompletedTask;
}
}
- 4 回答
- 0 關注
- 278 瀏覽
添加回答
舉報