从ASP.NET API中的身份验证过滤器中访问路由信息



我已经为我的API创建了一个身份验证过滤器,它将验证auth标题以确保用户可以访问API。但是,我还设置了将允许用户阅读但不写的端点的权限。我希望能够在此处执行此身份验证,如果失败,我可以杀死该请求。为此,我需要知道控制器和动作值。我可以访问URL字符串,但是除非我需要。

我不愿意自己解析。

我尝试使用以下代码从AuthentIcateAsync方法

var requestcontext = context.Request.GetRequestContext();
string actionName = requestcontext.RouteData.Values["action"].ToString();
string controllerName = requestcontext.RouteData.Values["controller"].ToString();

此时尚未设置控制器和操作键,这将返回问题。有没有办法迫使他们被设定?意思是,我可以调用一种方法,该方法将迫使.NET立即设置路由数据,而不是以后,从而允许我访问值?

如果这是不可能的。我怎么能实现这一目标?我试图创建一个基础apicontroller,在这里我尝试添加以下内容。

protected override void OnAuthorization(AuthorizationContext filterContext)
{
//check the route data and validate 
}

这不起作用,因为apicontroller不支持此方法。假设它是MVC控制器的一部分,而不是API。我尝试了与MVC一起使用的其他各种覆盖,但它们不适用于API控制器。我宁愿能够在过滤器中处理所有内容,以便我不需要使用控制器,但是如果这是唯一的方法,该如何完成?

以下代码可在身份验证期间获取操作和控制器数据。

public class MyCustomFilter : IAuthenticationFilter
{
    public bool AllowMultiple { get; }
    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        string actionName = context.ActionContext.ActionDescriptor.ActionName;
        string controllerName = context.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;
    }
}

最新更新