访问 API 个控制器时执行代码

Executing code when accessing API controllers

我有以下代码:

CookieHeaderValue cookie = Request.Headers.GetCookies("session").FirstOrDefault();
var isAuthenticated = _userService.IsAuthenticated(cookie);

if (!isAuthenticated) 
    return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "");

我希望此代码在我的 api 的任何部分被调用时立即执行。我还没有找到任何好的解决方案或方法来做到这一点,所以我想我会在这里问。

(我现在做的是在每个 get/post/put/delete 中执行代码,这太可怕了)。

您可以为此目的使用 ActionFilter 或 AuthorizationFilter。这些是您可以在特定 controllers/actions 上或全局使用的属性 类。所以你不需要为每个动作重复代码。

有关详细信息,请参阅此 link。它显示了 ASP.NET Web API 中的一般 authentication/authorization 流程以及如何对其进行自定义。

解决此问题的最佳方法是授权过滤器属性。参见 Authentication Filters in ASP.NET Web API 2

主题太宽泛,无法在此完整重复,但归结为创建属性:

public class CookieAuthenticationFilterAttribute : Attribute, IAuthenticationFilter
{
    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        // your cookie code
    }
}

并将其应用于控制器或操作方法:

[YourCookieAuthentication]

但请务必阅读link。

所以我发现我的问题的最佳解决方案是以下代码:

public class CookieFilterAttribute : AuthorizeAttribute
{
    [Inject]
    public IUserService UserService { get; set; }

    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        CookieHeaderValue cookie = actionContext.Request.Headers.GetCookies("session").FirstOrDefault();
        var isAuthenticated = UserService.IsAuthenticated(cookie);

        return isAuthenticated;
    }
}