Web API中的自定义IAuthenticationFilter和AllowAnonymous

时间:2014-12-17 17:00:41

标签: c# authentication asp.net-web-api2 custom-attributes

我想使用AllowAnonymous和自定义AuthenticationFilter。有人能指出我正确的方向来使用AllowAnonymous或其他替代方案吗?谢谢

我创建了自己的自定义过滤器,该过滤器继承自System.Attribute并实现System.Web.Http.Filters.IAuthenticationFilter

 public class MyCustomAuthenticationAttribute : Attribute, IAuthenticationFilter

我能够成功添加AuthenticateAsync方法的逻辑

 public async Task AuthenticateAsync(
     HttpAuthenticationContext context, 
     CancellationToken cancellationToken) {}

我的问题是我需要忽略一些Web API控制器操作或控制器。我以为我可以用System.Web.Http.AllowAnonymousAttribute来做这件事。例如,这是一个显示意图的非常简单的示例。

[MyCustomAuthentication]
public class HomeController : ApiController
{
    // no authentication needed allow anonymous 
    [HttpGet]
    [Route("hianonymous")]
    [AllowAnonymous]
    public IHttpActionResult Hello(string name) {
        return Ok(new { message = "hello " + name }); 
    }

    // needs to be authenticated 
    [HttpGet] 
    [Route("hiauthenticated")]
    public IHttpActionResult Hello() {
        var name = User.Identity.Name;
        return Ok(new { message = "hello authenticated user " + name });  
    }
}

问题是Authenticate()上仍然会调用MyCustomAuthenticationAttribute。我想用AllowAnonymous或其他方法来实现这一目标。感谢您的任何意见。

我知道我可以在操作级别而不是控制器级别使用我的自定义身份验证属性,但有些情况下我想要整个控制器甚至是全局过滤器,所以我需要能够排除个别操作或控制器基础。

1 个答案:

答案 0 :(得分:9)

IAuthenticationFilter的实施应该 NOTHING ,如果它找不到它无法识别的授权方案。

http://www.asp.net/web-api/overview/security/authentication-filters

// 2. If there are no credentials, do nothing.
if (authorization == null)
{
    return;
}

// 3. If there are credentials but the filter does not recognize the 
//    authentication scheme, do nothing.
if (authorization.Scheme != "Basic")
{
    return;
}

我们的想法是,您的过滤器只是使用已知方案 AUTHENTICATE 的一种方式。

您仍然需要使用内置的AuthorizeAttributeAllowAnonymousAttribute来控制 AUTHORIZATION