C# 如何将信息从AuthorizationFilter传递到正在授权的操作?

C# 如何将信息从AuthorizationFilter传递到正在授权的操作?,c#,asp.net-core,authorization,asp.net-core-webapi,C#,Asp.net Core,Authorization,Asp.net Core Webapi,我已经使用IAsyncAuthorizationFilter为我的API实现了AuthorizationFilter,并且希望能够将有关授权用户的信息传递给具有此授权筛选器的操作。由于过滤器已经在检索该信息,我希望不必在操作本身中再次检索该信息 通过AuthorizationFilterContext对象,我看到我们可以通过HTTPContext访问请求的RouteValue。向RouteValues集合添加一个新的KeyValuePair似乎是我想要的,但感觉可能会有问题,或者有更好的方法来实

我已经使用IAsyncAuthorizationFilter为我的API实现了AuthorizationFilter,并且希望能够将有关授权用户的信息传递给具有此授权筛选器的操作。由于过滤器已经在检索该信息,我希望不必在操作本身中再次检索该信息

通过AuthorizationFilterContext对象,我看到我们可以通过HTTPContext访问请求的RouteValue。向RouteValues集合添加一个新的KeyValuePair似乎是我想要的,但感觉可能会有问题,或者有更好的方法来实现这一点

是否有一种“最佳实践”方法来实现这一点,或者我的解决方案是否可以接受

示例代码:

public class AuthorizeAttribute : Attribute, IAsyncAuthorizationFilter
{
    private string[] _PermittedRights;
    public AuthorizeAttribute() : this(null) { }

    public AuthorizeAttribute(string[] permittedRights)
    {
        _PermittedRights = permittedRights;
    }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var authResult = await AuthenticationHelper.AuthenticateApiCallAsync(context.HttpContext.Request.Headers);
        if (authResult.Succeeded == true)
        {
            context.HttpContext.Request.RouteValues.Add("AuthUser", authResult.AuthenticatedUser);
        }
        else
        {
            context.Result = new UnauthorizedResult();
        }
    }
}

我认为你的方法是可行的。此处不能使用TempData之类的属性,路由本身携带操作的相关参数和值​​不同端点的连接。路线价值​​属于请求对象,其内容将保存到此端点的末尾。或者,您可以通过上下文对象的RouteData传递检索到的数据

下面是一个演示:

授权属性:

public class AuthorizeAttribute : Attribute, IAsyncAuthorizationFilter
{
    //...

   

     public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            context.RouteData.Values.Add("AuthUser", new { name="buble"});//Put the retrieved value into this object
            
    /*var authResult = await AuthenticationHelper.AuthenticateApiCallAsync(context.HttpContext.Request.Headers);
            ...
            */
        }
    }
以这种方式接受

[Authorize]
    public IActionResult index2()
    {
        var res= RouteData.Values["AuthUser"];
        return Json("true");
    }
结果:

路由数据:

我不知道上下文的路由数据。这是否仍然与WebAPI的特定连接/操作有关?我需要确保它不会交叉污染另一个请求。RoutedData是关于当前路由路径的信息。以下是它的详细信息。测试后,它不能交叉污染到另一个请求。RoutedData的范围仅限于当前路由上下文。除非在特定操作上引用此筛选器,否则它将在当前路由上下文中工作。