我正在开发一个包含所有需要身份验证的API的Web服务。使用WebApiConfig
中配置的全局消息处理程序执行身份验证,如下所示:
config.MessageHandlers.Add(new AuthMessageHandler());
现在我们想公开一个不执行身份验证的新API。我最初的方法是为这个新API配置一个路由处理程序,但是从我在各个地方阅读的内容(例如Microsoft docs about HTTP message handlers),全局消息处理程序在HttpRoutingDispatcher
之前被调用,所以在命中任何每个路由处理程序之前,请求仍将通过全局处理程序。我想出了一些可能的解决方案:
为所有路由配置路由处理程序。我们有很多API,但由于编写代码的方式我认为这可以像单行添加和删除一样少。我不喜欢它,因为我们必须在将来添加新路由时要更加小心,以确保它们经过适当的身份验证。此外,由于我们支持的API数量庞大,我不相信我必须涵盖所有这些API。我们有理由在全球范围内开展这项工作。
修改处理程序,使其具有绕过身份验证的路由的某种白名单。我想避免这种情况,因为它使处理程序代码复杂化。此外,它是一个完全不同的公共代码库,我真的不想在那里挖掘......
正如您可能知道的那样,如果可能的话,我想避免这两种解决方案。有没有办法从全局消息处理程序中排除某些路由?也许这会破坏首先拥有全局处理程序的目的,但如果这在某种程度上可能会很好。
答案 0 :(得分:2)
正如对原始问题的评论中所建议的,解决方案是在具有匿名API的控制器上使用AllowAnonymousAttribute
。仅此一项并未解决问题,因为我们不使用构建AuthorizeAttribute
的{{1}},但我们的处理程序可以使用此检查来确定是否授权请求:
AllowAnonymousAttribute
请注意,这仅适用于控制器级别。我无法找到一个快速的解决方案来确定将调用哪个控制器方法以及该方法是否具有该属性,因为这在请求链中的这一点显然不那么容易。