Asp.net在开发环境中“禁用”身份验证

问题描述 投票:12回答:3

是否可以在不改变逻辑的情况下在asp.net核心应用程序中“禁用”身份验证?

我有一个.net网站,它使用外部身份服务器应用程序进行身份验证。无论如何,我希望能够在我开发它时模拟身份验证(ASPNETCORE_ENVIRONMENT =开发),对所有忽略授权属性的操作进行访问。

是否可以仅仅模拟服务集合中的某些服务?

asp.net-core
3个回答
10
投票

我在qazxsw poi上找到了解决这个问题的方法。

此代码必须有效:

illucIT Blog

5
投票

在没有更多详细信息的情况下给出详细答案是很棘手的,但我之前通过有条件地注册来实现这一目标:

  • 外部认证中间件
  • 需要经过身份验证的请求的全局策略

它看起来像:

if (env.IsDevelopment()) {
   services.AddMvc(opts =>
   {
      opts.Filters.Add(new AllowAnonymousFilter());
   });
} else {
   services.AddMvc();
}

就我而言,授权过滤器是全局应用的,因此MVC应用程序的每个操作都需要经过身份验证的用户。

如果您有不同的要求 - 某些操作的细粒度public class Startup { public Startup(IHostingEnvironment env) { Environment = env; } public IHostingEnvironment Environment { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(x => { if (!Environment.IsDevelopment()) { var authenticatedUserPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); x.Filters.Add(new AuthorizeFilter(authenticatedUserPolicy)); } }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.UseStaticFiles(); if (!Environment.IsDevelopment()) { // Register external authentication middleware } app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } 属性 - 那么您可以通过更改相关授权策略的构建方式来实现相同的结果。它们基本上根本不包含任何要求。

[Authorize]

0
投票

您可能要考虑的另一个解决方案是使用IPolicyEvaluator。这意味着您可以保留所有现有的安全元素。

AuthorizationPolicy yourCustomPolicy = null;
if (Environment.IsDevelopment())
{
    yourCustomPolicy = new AuthorizationPolicyBuilder().Build();
}
else
{
    yourCustomPolicy = new AuthorizationPolicyBuilder()
        // chaining appropriate methods to suit your needs
        .Build();
}

在Startup.cs中,确保它出现在ConfigureServices方法的顶部。例如。

public class DisableAuthenticationPolicyEvaluator : IPolicyEvaluator
{
    public async Task<AuthenticateResult> AuthenticateAsync(AuthorizationPolicy policy, HttpContext context)
    {
        // Always pass authentication.
        var authenticationTicket = new AuthenticationTicket(new ClaimsPrincipal(), new AuthenticationProperties(), JwtBearerDefaults.AuthenticationScheme);
        return await Task.FromResult(AuthenticateResult.Success(authenticationTicket));
    }

    public async Task<PolicyAuthorizationResult> AuthorizeAsync(AuthorizationPolicy policy, AuthenticateResult authenticationResult, HttpContext context, object resource)
    {
        // Always pass authorization
        return await Task.FromResult(PolicyAuthorizationResult.Success());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.