我想使用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 }); } }
问题是仍然在MyCustomAuthenticationAttribute上调用Authenticate().我想使用AllowAnonymous或其他方法来实现这一目标.感谢您的任何意见.
我知道我可以在操作级别而不是控制器级别使用我的自定义身份验证属性,但有些情况下我想要整个控制器甚至作为全局过滤器,因此我需要能够在单个操作或控制器的基础上排除.
解决方法
如果IAuthenticationFilter没有找到它无法识别的授权方案,那么它的实现应该没有.
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的方法.
您仍然需要使用内置的AuthorizeAttribute和AllowAnonymousAttribute来控制AUTHORIZATION.