У меня есть веб-приложение ASP.NET Core 2.1 с Razor Pages, в котором информация аутентификации AAD определена в файле appsettings.json
(любезно предоставлено шаблоном приложения по умолчанию - о том, как я туда попал, см. Ниже). Тем не менее, при попытке настроить аутентификацию в Startup.cs
конфигурация не имеет никаких значений конфигурации из моего appsettings.json
. Если я проверяю объект IConfiguration
в отладчике, то он, похоже, имеет только конфигурации переменных среды:
Вот метод Startup.ConfigureServices
, в котором проблема заключается:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options =>
{
// This is from the default template. It should work, but the relevant settings aren't there so options isn't populated.
this.Configuration.Bind("AzureAd", options);
// This of course works fine
options.Instance = "MyInstance";
options.Domain = "MyDomain";
options.TenantId = "MyTenantId";
options.ClientId = "MyClientId";
options.CallbackPath = "MyCallbackPath";
});
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
И конфигурация службы в случае ее важности (обратите внимание, что она создается поверх службы без сохранения состояния фабричной структуры):
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");
return new WebHostBuilder()
.UseKestrel(opt =>
{
int port = serviceContext.CodePackageActivationContext.GetEndpoint("ServiceEndpoint").Port;
opt.Listen(IPAddress.IPv6Any, port, listenOptions =>
{
listenOptions.UseHttps(GetCertificateFromStore());
listenOptions.NoDelay = true;
});
})
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}))
};
}
Для создания этого сервиса я использовал мастер в VS2017. Я выбрал существующий проект сервисной фабрики (.sfproj
) и выбрал Services > Add > New Service Fabric Service
и выбрал Stateless ASP.NET Core [for .NET Framework]
, затем на следующей странице я выбрал Web Application
(тот, что со страницами Razor, а не MVC) и щелкнул Change Authentication
, где я выбрал Work or School Accounts
и ввел мою информацию AAD. Единственными изменениями, которые я сделал в этом шаблоне, было добавление кода в вызове к AddAzureAD
в Startup.ConfigureServices
и установка файлов appsettings.json
, которые всегда будут копироваться в выходной каталог.
Почему файл appsettings.json
не загружается в конфигурацию? Как я понимаю, это должно происходить по умолчанию, но что-то, похоже, отсутствует ...