我认为我有3个可能的地方将我的东西插入管道
1) AuthorizationFilters
2) Action Filters
3) DelegatingHandler
最明显的是AuthorizationFilters,我可以使用自定义授权属性来装饰我的操作/控制器。说.. MyCustomAuthorizationAttribute
。
由于HTTP消息处理程序处于处理管道的第一阶段。把它放在那里是否有意义?
现在授权我只是意味着检查标头中的一个令牌,该令牌在认证后提供给客户端。
答案 0 :(得分:37)
2014年7月更新
我的原始答案涵盖WebApi 1. WebApi 2有一些变化,即现在有一个IAuthenticationFilter
意味着您可以将身份验证逻辑移出DelegatingHandler
,这更加优雅。
Nuget项目here提供了IAuthenticationFilter的实现,并解释了其引入的一些背景知识。
OWIN中间件现在可能是实现身份验证逻辑的最佳位置 - here中有一个证书身份验证this blog post和基本身份验证OWIN中间件的示例,前一个示例是首选示例演示了基类AuthenticationHandler
类的使用。
关于AuthorizationFilters
的建议基本保持不变。
结束更新
...通常
使用DelegatingHandler
执行身份验证...即某人是谁。使用它来设置线程和用户上下文的原则,添加声明等。您也可以在此处放置授权逻辑,但是在全球范围内。我个人总是使用AuthorizationFilters进行授权。
使用AuthorizationFilters
限制特定人员的控制器和操作。当您可以使用claim,principal,url或http请求参数中的信息推断其权限时,可以使用这些权限。默认授权过滤器可用于限制对匿名用户或角色的访问(如果设置为委托处理程序) - 显然,如果需要,您也可以实现自己的AuthorizationFilters。
当您需要使用邮件内容做出有关授权的决定时,偶尔会使用ActionFilters
,例如你需要访问实体上的一个属性来决定他们是否有访问权限(显然要小心这个(!))。
注意:
在读取正文内容之前调用AuthorizationFilters
因此他们无权访问邮件正文以进行授权决策这就是为什么ActionFilters
特别是OnActionExecuting
是用于偶尔引发身份验证错误。
<强>因此强>
在你的场景中,我会设置一个简单的DelegatingHandler
来获取标题并设置主体。
public class CustomAuthenticationMessageHandler : DelegatingHandler
{
public CustomAuthenticationMessageHandler ()
{
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
Authenticate(request);
return base.SendAsync(request, cancellationToken);
}
protected virtual void Authenticate(HttpRequestMessage request)
{
var authorisationHeader = request.Headers.Authorization;
if (authorisationHeader == null)
{
return;
}
//Ensure you are happy with the header contents then
{
var principal = new GenericPrincipal(//new Identity , //Roles);
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
}
}
}
然后使用AuthorizationFilters
限制访问权限:
[Authorize]
public string Get()
{
}
[Authorize(Roles = "Admin")]
public string GetAdminOnly()
{
}
注册全局身份验证
config.MessageHandlers.Add(new CustomAuthenticationMessageHandler());
这意味着在每个请求中,主体将被设置为null或有效标识。它不会处理授权,即不会拒绝访问任何控制器或操作。
开始保护资源
使用标准或自定义[授权]属性定位受保护的控制器和操作。或全球注册:
config.Filters.Add(new AuthorizeAttribute());
只有白名单列出了您想要使用[AllowAnonymous]
属性取消保护的控制器和操作。
如果您只想在某些路线上进行身份验证
然后,您可以稍微修改DelegatingHandler
以将InnerHandler
设置为路由到正确的控制器,例如
public CustomAuthenticationMessageHandler(HttpConfiguration configuration)
{
InnerHandler = new HttpRoutingDispatcher(configuration);
}
然后你可以像你这样在你的路线上指定这个处理程序:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "myurl",
defaults: new {},
constraints: new {},
handler: new CustomAuthenticationHandler(config)
);