Во время запуска я настраиваю файл cookie аутентификации личности:
services.ConfigureApplicationCookie(x =>
{
x.Cookie.Name = "foo"; // default is ".AspNetCore.Identity.Application"
// other config...
});
Мне нужна информация об этом файле cookie во время выполнения, поэтому в какой-то контроллер я вставляю IOptions<CookieAuthenticationOptions>
, а затем пытаюсь получить имя файла cookie:
var cookieName = cookieAuthenticationOptions.Value.Cookie;
Это дает ".AspNetCore."
вместо "foo"
. Другие свойства этого объекта также неверны: все они кажутся значениями по умолчанию.
Почему это происходит и как мне получить действительный экземпляр этого объекта параметров?
@BenderBoy Спасибо. Я делаю что-то подобное - по необходимости. Но это хак, и я бы хотел этого избежать. Кроме того, для всех остальных параметров конфигурации файлов cookie установлены значения по умолчанию. Я очень удивлен, что это не работает.
Вы пробовали вводить CookieAuthenticationOptions
вместо IOptions
?
ASP.NET Core Identity использует именованный подход IOptions
, но DI по умолчанию IOptions
предоставляет безымянный экземпляр по умолчанию (в данном случае) CookieAuthenticationOptions
. Это означает, что экземпляр, который вы получаете от DI, отличается от экземпляра, настроенного с помощью ConfigureApplicationCookie
.
Чтобы получить доступ к именованному экземпляру IOptions
, вы можете использовать IOptionsSnapshot
или IOptionsMonitor
(документы). Вот пример того, как получить доступ к экземпляру ASP.NET Core Identity CookieAuthenticationOptions
:
Вставьте IOptionsMonitor<CookieAuthenticationOptions>
в конструктор контроллера.
В действии используйте следующий код:
var cookieName = cookieAuthenticationOptions
.Get(IdentityConstants.ApplicationScheme)
.Cookie.Name;
Спасибо, это сработало. Всякий раз, когда мне нужна конфигурация запуска, я обычно добавляю IOptions<T>
, поэтому я сделал то же самое и здесь. Я не рассматривал проблему именования.
Мне любопытно, можно ли узнать, какие объекты параметров называются, а какие нет? Как в данном случае вы узнали, что нужный мне объект options был одним из названных? (Полагаю, можно просто попробовать оба пути, если знать об этой «подвохе».)
Я сталкивался с этим раньше при работе с AuthN, который имеет концепцию имен схем и, следовательно, требует возможности настройки нескольких экземпляров. В частности, здесь ConfigureApplicationCookie использует перегрузку...
Не могли бы вы поместить имя файла cookie в файл appsettings.json и просто ссылаться на
IConfiguration
в обоих местах?