访问API控制器时执行代码

时间:2015-12-01 14:14:16

标签: c# asp.net-web-api asp.net-web-api2 httpresponse

我有以下代码:

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

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

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

(我现在做的是在每个get / post / put / delete中执行代码,这很糟糕)。

3 个答案:

答案 0 :(得分:1)

解决此问题的最佳位置是授权过滤器属性。请参阅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]

但请务必阅读链接。

答案 1 :(得分:0)

您可以使用ActionFilter或AuthorizationFilter来实现此目的。这些是可以在特定控制器/操作上或全局使用的属性类。因此,您不需要为每个操作重复代码。

有关详细信息,请参阅此link。它显示了ASP.NET Web API中的常规身份验证/授权流以及如何自定义它。

答案 2 :(得分:0)

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

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;
    }
}