using Microsoft.AspNetCore.Authentication.Negotiate; using Microsoft.OpenApi.Models; using NLog; using NLog.Web; var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger(); logger.Info("Logging initialized!"); try { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(); builder.Services.AddAuthorization(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "FakeNTLMServer", Version = "v1", Description = "NTLM/Negotiate authentication test server" }); options.AddSecurityDefinition("Negotiate", new OpenApiSecurityScheme { Type = SecuritySchemeType.Http, Scheme = "Negotiate", Description = "Windows Authentication (NTLM/Kerberos). Credentials are sent automatically by the browser." }); options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Negotiate" } }, Array.Empty() } }); var xmlFile = $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); if (File.Exists(xmlPath)) options.IncludeXmlComments(xmlPath); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment() || app.Configuration.GetValue("EnableSwagger")) { app.UseSwagger(); app.UseSwaggerUI(options => { // Enable sending credentials (NTLM tokens) with Swagger UI requests options.ConfigObject.AdditionalItems["withCredentials"] = true; }); } app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); } catch (Exception ex) { logger.Error(ex, "Stopped program because of exception"); throw; }