WebAPI .NET Core 3基本身份验证

时间:2020-05-16 23:37:12

标签: c# asp.net-core asp.net-web-api basic-authentication

我需要向一组API添加基本身份验证。

免责声明: API位于Intranet内,并包含公共数据。只能通过实现了强身份验证和授权的API网关才能从外部用户使用它们。仅需要基本身份验证才能避免内部开发团队直接调用此服务。用户名和密码不是真实的。

我使用了ZNetCS.AspNetCore.Authentication.Basic软件包,版本4.0.0

这是我的startup.cs:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddAuthentication(BasicAuthenticationDefaults.AuthenticationScheme)
            .AddBasicAuthentication(
              options =>
              {
                  options.Realm = "My Application";
                  options.Events = new BasicAuthenticationEvents
                  {
                      OnValidatePrincipal = context =>
                      {
                          if ((context.UserName.ToLower() == "gateway0107") 
                                     && (context.Password == "jir6STt6437yMAQpl"))
                          {
                              var claims = new List<Claim>{
                                            new Claim(ClaimTypes.Name,
                                                        context.UserName,
                                                        context.Options.ClaimsIssuer)
                                };

                              var ticket = new AuthenticationTicket(
                                new ClaimsPrincipal(new ClaimsIdentity(
                                  claims,
                                  BasicAuthenticationDefaults.AuthenticationScheme)),
                                new Microsoft.AspNetCore.Authentication.AuthenticationProperties(),
                                BasicAuthenticationDefaults.AuthenticationScheme);

                              return Task.FromResult(AuthenticateResult.Success(ticket));
                          }

                          return Task.FromResult(AuthenticateResult.Fail("Authentication failed."));
                      }
                  };
              });

        services.AddMvcCore();
        services.AddApiVersioning(
                            options =>
                            {
                                options.ReportApiVersions = true;
                            });
        services.AddVersionedApiExplorer(
            options =>
            {
                options.GroupNameFormat = "'v'VVV";
                options.SubstituteApiVersionInUrl = true;
            });
        services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
        services.AddSwaggerGen(
            options =>
            {
                options.OperationFilter<SwaggerDefaultValues>();
                options.IncludeXmlComments(XmlCommentsFilePath);
            });

        services.AddCors(options =>
        {
            options.AddPolicy(name: "AllowAllOrigins",
                              builder =>
                              {
                                  builder.AllowAnyOrigin();
                              });
        });

        services.AddControllers(options =>
        {
            options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Point)));
            options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Coordinate)));
            options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(LineString)));
            options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(MultiLineString)));
        }).AddNewtonsoftJson(options =>
        {
            foreach (var converter in NetTopologySuite.IO.GeoJsonSerializer.Create(new GeometryFactory(new PrecisionModel(), 4326)).Converters)
            {
                options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
                options.SerializerSettings.Converters.Add(converter);
            }
        }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider)
    {
        app.UseForwardedHeaders();
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(
             Path.Combine(Directory.GetCurrentDirectory(), "swagger-ui")),
            RequestPath = "/swagger-ui"
        });

        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseCors("AllowAllOrigins");

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });

        app.UseSwagger();
        app.UseSwaggerUI(
            options =>
            {
                // build a swagger endpoint for each discovered API version
                foreach (var description in provider.ApiVersionDescriptions)
                {
                    options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
                }
            });

    }
    static string XmlCommentsFilePath
    {
        get
        {
            var basePath = PlatformServices.Default.Application.ApplicationBasePath;
            var fileName = typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml";
            return Path.Combine(basePath, fileName);
        }
    }
}

但是在Postman和SwaggerUI中进行测试时,我总是得到410未经授权。 在OnValidatePrincipal内设置一个断点,它永远不会被命中。

我还必须添加其他内容吗?

0 个答案:

没有答案