【发布时间】:2015-03-27 19:38:21
【问题描述】:
多个身份验证过滤器的预期语义是什么?是允许的吗?如果是这样,它们如何协同工作?
这是一个具体的例子。假设我有一个控制器类,例如
[BasicAuthenticator]
[LocalAuthenticator]
[Authorize]
public class TestController : ApiController
{
[AllowAnonymous]
public IHttpActionResult GetProduct(int id)
{
}
// etc. etc
}
BasicAuthenticator 和 LocalAuthenticator 在其中实现了 IAuthenticationFilter。
每个身份验证者都有机会成功。如果其中任何一个成功,它会将context.Principal 设置为具有适当ClaimsIdentity(名称、类型和isAuthenticated = true)的新对象。
如果身份验证器失败怎么办?我认为它应该什么都不做,这样另一个人就有机会成功。对吧?
如果两者都成功呢?第二个是否会擦除第一个创建的委托人?将两个 Principal 对象的 ClaimsIdentity 集合合并在一起不是更有意义吗?
如果验证器失败,它应该什么都不做,对吗?因为其他身份验证器可能会成功。拥有两个身份验证器的语义是,如果其中一个成功,则该操作将运行,对吗?
我认为 Authorize 类将查看主体中的所有 ClaimsIdentity,如果任何 ClaimsIdentity 具有“isAuthenticated = true”,那么它将允许控制器操作运行。否则,它将设置状态 = 401。这似乎是它的工作原理。对吗?
[AllowAnonymous] 的目的是禁用所有其他授权过滤器,对吗?控制器(或操作方法)用[AllowAnonymous] 装饰,然后我假设它应该始终运行,即使身份验证失败。对吗?
【问题讨论】:
标签: .net web-services authentication authorization asp.net-web-api2