正如我所看到的,我有3个可能的地方在管道中插入我的东西
1) AuthorizationFilters
2) Action Filters
3) DelegatingHandler
最明显的是AuthorizationFilters,我可以用我的自定义授权属性来装饰我的操作/控制器。比方说..MyCustomAuthorizationAttribute
。
因为HTTP消息处理程序处于处理流水线的第一阶段。把它放进去有什么意义吗?
对我来说,现在的授权只意味着检查头部中的令牌,该令牌在身份验证后提供给客户端。
发布于 2013-02-14 10:42:55
更新2014年7月
我最初的回答涵盖了WebApi 1。在WebApi 2中有一些变化,即现在有了IAuthenticationFilter
,这意味着您可以将身份验证逻辑移出DelegatingHandler
,这会更优雅一些。
有一个Nuget项目here,它提供了IAuthenticationFilter的实现,并解释了其介绍的一些背景知识。
OWIN中间件现在可能是实现您的身份验证逻辑的最佳位置-在this blog post中间件中有一个证书身份验证here和基本身份验证OWIN的示例,前一个示例是首选的,因为它演示了基本AuthenticationHandler
类的使用。
关于AuthorizationFilters
的建议基本保持不变。
结束更新
通常..。
使用DelegatingHandler
执行身份验证...也就是某人是谁。使用它来设置线程和用户上下文的原则,添加声明等。你也可以在这里放置授权逻辑,但在相当大的全球范围内。我个人总是使用AuthorizationFilters进行授权。
使用AuthorizationFilters
将控制器和操作限制为特定人员。当您可以使用声明、主体、url或http请求参数中的信息来推断它们的权限时,就会使用它们。默认授权筛选器可用于限制匿名用户或按角色进行访问(如果设置在委托处理程序中)-显然,如果需要,您也可以实现自己的AuthorizationFilters。
当您需要使用消息内容进行授权决策时,偶尔使用ActionFilters
。例如,您需要访问实体上的属性以确定它们是否具有访问权限(显然要小心这个(!))。
注意:
AuthorizationFilters
在读取正文内容之前被调用,因此它们无权访问消息体来做出授权决策,这就是为什么使用ActionFilters
,特别是OnActionExecuting
偶尔会引发身份验证错误的原因。
So
在您的场景中,我将放入一个简单的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());
这意味着在每个请求中,主体将被设置为空或有效的身份。它不会处理授权,也就是不会拒绝对任何控制器或操作的访问。
开始保护资源
使用标准或自定义授权属性来定位受保护的控制器和操作。或全局注册:
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)
);
https://stackoverflow.com/questions/14871925
复制相似问题