我不会'删除'授权。假设您有一个客户而CustomerId是一个索赔,那么您无法测试代码,因为缺少索赔。相反,我会选择为开发目的添加一个标识。
这可能是一个黑客,但我的策略是添加一个过滤器,其中设置当前用户,包括所需的角色:
using System.Security.Principal; using System.Web; using System.Web.Http.Controllers; using System.Web.Http.Filters; public class AddIdentityFilter : AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) { HttpContext.Current.User = new GenericPrincipal(new GenericIdentity("John"), new[] { "Admin" }); base.OnAuthorization(actionContext); } }
在WebApiConfig.cs中添加过滤器:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.SuppressDefaultHostAuthentication(); // Add some logic here to determine the environment var isDevelopment = true; if (isDevelopment) config.Filters.Add(new AddIdentityFilter()); // ... }
这样,您可以在开发时定义多个测试场景。
我将分享几种方法来做到这一点。我的服务工作方式,我们有一个基本控制器类FooController,其中包含服务的所有逻辑。每个环境(请不要问!)我们有源自FooController的DevFooController。
在里面 Register 方法我们有一些看起来像这样的东西:
Register
var controller = (Environment.GetEnvironmentVariable("DEV_ENVIRONMENT") == "1") ? "DevFoo" : "Foo"; /// api/{tenant}/{id} config.Routes.MapHttpRoute( name: "RouteName", routeTemplate: "api/{tenant}/{id}", defaults: new { controller = controller, action = "actionName" });
属性应用于相应的控制器。
做作?对。作品?也是的。
我曾经使用过的另一个系统来处理使用的依赖注入。所有控制器始终注册。在每次请求时,注射器都有一些关于请求(dev / prod,flight,geo等)的多汁位,并且能够选择正确的混凝土控制器。这些类看起来很相似,但是FooController也实现了IFooController,并且多个注册类都可以同时使用,而上面的例子中只有一个静态配置的路由可用。
我更喜欢IoC方法,但当我支持的服务正在白板上绘制时,我不在身边。
我们也以这种方式实现的一个值得注意的特性是CORS支持。它不适用于任何预生产端点。
最后,我们在我们的几个方法上有一个ActionFilter,它可能会像你想要的那样工作。 “允许匿名”逻辑在ActionFilter中。如果 your condition is true 过滤器只是继续而不验证任何身份。我们执行自己的AuthZ,但可以像您描述的那样对其进行配置。
your condition is true
希望其中一个建议对您有用。