我有一个带有多个控制器的WebAPI2 REST api。我使用基于角色的身份验证。我在所有控制器和某些方法上都添加了[Authorize]属性。但是,在DEV环境中,我想禁用身份验证。我希望可以将一些代码放入SELECT Name,
SUM(IF(typeofcontract='Account') THEN 1 ELSE 0) NoOfAccount,
SUM(IF(typeofcontract='Loan') THEN 1 ELSE 0) NoOfLoan,
SUM(IF(typeofcontract='Deposit') THEN 1 ELSE 0) NoOfDeposit,
SUM(IF(typeofcontract='Account') THEN amount * -1
ELSE IF (typeofcontract='Loan') THEN amount) BorrowedAmount,
SUM(IF(typeofcontract='Deposit') THEN amount) AvailableAmount,
SUM(IF(typeofcontract='Deposit') THEN amount
ELSE IF (typeofcontract='Loan') THEN amount * -1) TotalAmount
FROM Table1
GROUP BY Name
中,例如:
WebApiConfig
但是,这不会编译,因为
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
//==============================================
// NOTE: disable all authentication in the DEV_ENVIRONMENT
if (Environment.GetEnvironmentVariable("DEV_ENVIRONMENT") == "1")
{
config.Filters.Add(new AllowAnonymousAttribute());
}
}
}
在运行时是否可以关闭REST api中的所有身份验证?
答案 0 :(得分:1)
我将分享几种方法。我的服务的工作方式是,我们有一个基础控制器类FooController,其中包含用于服务的所有逻辑。根据环境(请不要问!),我们有从FooController派生的DevFooController。
在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" });
属性在相应的控制器上应用。
曲棍球?对。作品?也是。
我用来处理依赖注入的另一个系统。所有控制器始终处于注册状态。在每个请求上,注入器都有一些关于请求的内容(开发/生产,航班,地理位置等),并且能够选择正确的混凝土控制器。这些类看起来很相似,但是FooController还实现了IFooController,并且多个注册的类都可以同时使用,而上面的示例中只有一个静态配置的路由可用。
我更喜欢IoC方法,但是当我现在在白板上拟定我支持的服务时,我不在身边。
我们也以这种方式实现的一个值得注意的功能是对CORS的支持。在任何预生产端点上均不可用。
最后,我们在可能会按您希望的方式工作的几种方法上都有一个ActionFilter。 “允许匿名”逻辑位于ActionFilter本身中。如果your condition is true
,过滤器将继续而不验证任何身份。我们执行自己的AuthZ,但可以按照您的描述进行配置。
希望这些建议之一对您有用。
答案 1 :(得分:1)
我不会“删除”授权。假设您有一个客户,并且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());
// ...
}
这样,您可以在开发时定义多个测试场景。