C# 授权属性依赖于运行时配置
我有一个.Net Core 3.0 Web API,配置如下:C# 授权属性依赖于运行时配置,c#,asp.net,asp.net-core,authorization,asp.net-core-3.0,C#,Asp.net,Asp.net Core,Authorization,Asp.net Core 3.0,我有一个.Net Core 3.0 Web API,配置如下: services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(x => {
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
...
});
services.AddAuthorizationCore(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
我在控制器中启用它,如:
[Authorize(Roles = "Admin,Technician")]
public IActionResult CreateFoo([FromBody] Foo foo)
某些api端点也使用[AllowAnonymous]
禁用
此产品支持多个环境,一个端点需要匿名或授权,具体取决于运行时变量;目前正在使用自定义的“ASPNETCORE_环境”选项
我看到了.net安全人员的评论,但如果我实现了自定义策略,它将禁止匿名访问
如果应用程序在特定环境中运行,允许匿名访问的最简单方法是什么?只是一个实现。您可以创建自己的实现,绕过特定环境的身份验证:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class EnvironmentSpecificAutorizeAttribute : AuthorizeAttribute
{
public string AllowAnonymousEnvironment { get; set; }
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
// if currentEnv == AllowAnonymousEnvironment
// return
// else
// base.HandleUnauthorizedRequest(actionContext);
}
public override void OnAuthorization(HttpActionContext actionContext)
{
// same logic as above
base.OnAuthorization(actionContext);
}
public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
// same logic as above
return base.OnAuthorizationAsync(actionContext, cancellationToken);
}
}
您可能会在中找到其他建议如果我理解您的问题,那么您可以创建一个自定义属性,并在应用程序在特定环境中运行时始终授予用户访问权限
public class CustomEnvRequirement : AuthorizationHandler<CustomEnvRequirement>, IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomEnvRequirement requirement)
{
string currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
// Allow Anonymous when the current env is development.
if (currentEnv.ToLowerInvariant().Equals("development"))
{
context.Succeed(requirement);
}
else if (currentEnv.ToLowerInvariant().Equals("production"))
{
// TODO: add more authorization logic.
}
return Task.CompletedTask;
}
}
另外,请确保在startup.cs中对其进行配置
services.AddAuthorization(options =>
{
options.AddPolicy("CustomEnv",
policy => policy.Requirements.Add(new CustomEnvRequirement()));
});
我已经尝试过了,但仍然需要一个提示。这基本上是答案,但为了使其充分发挥作用,需要为DefaultPolicy创建一个新的AuthorizationPolicyBuilder,而无需RequireAuthenticatedUser。这不适用于AspNet Core,但感谢链接。Authorization属性源来自webapi,第二个链接是核心文档,为什么不适用?您可能需要覆盖core中的不同方法,但该方法是适用的。如果是的话,请随意提出编辑建议。
services.AddAuthorization(options =>
{
options.AddPolicy("CustomEnv",
policy => policy.Requirements.Add(new CustomEnvRequirement()));
});