Что такое CookieAuthenticationOptions.AuthenticationType используется?
в моем приложении Asp.Net Identity Auth middleware setup у меня есть
app.UseCookieAuthentication(new CookieAuthenticationOptions {
LoginPath = new PathString("/Login/"),
//AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
Provider = new CookieAuthenticationProvider {
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<MyUserManager, MyUser>(
TimeSpan.FromMinutes(30),
(manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie)
),
},
});
Я скопировал это из другого приложения и я просто заметил, что если я раскомментируйте AuthenticationType
line, login successes (я получаю сообщение об успехе в моем регистраторе, написанном с моего контроллера), но всегда перенаправляет обратно на экран входа в систему.
на документация для CookieAuthenticationOptions он говорит:
в AuthenticationType в опциях соответствует на AuthenticationType IIdentity собственность. Для использования одного и того же типа промежуточного по аутентификации в конвейере может быть назначено другое значение.(Наследуется от AuthenticationOptions.)
Я действительно не понимаю, что это значит, почему это приведет к перенаправлению моего запроса на вход (после успешного входа не менее), и что это за опция б быть полезным для.
3 ответов
это строка, и может быть все что угодно. Но это идентификатор типа аутентификации. И у вас может быть несколько типов аутентификации: ваша БД с пользователями, Google, Facebook и т. д. Насколько я помню, это добавляется как требование к сгенерированному cookie при входе в систему.
вы должны знать поставщика проверки подлинности при выходе пользователя. Если промежуточное по аутентификации определено следующим образом:
app.UseCookieAuthentication(new CookieAuthenticationOptions {
LoginPath = new PathString("/Login/"),
AuthenticationType = "My-Magical-Authentication",
// etc...
},
});
затем, чтобы выйти из пользователя, вам нужна та же волшебная строка: AuthenticationManager.SignOut("My-Magical-Authentication")
также эта строка передается в ClaimsIdentity
при создании principal. И без AuthenticationType
Принципал не может быть аутентифицирован , потому что:
/// <summary>
/// Gets a value that indicates whether the identity has been authenticated.
/// </summary>
///
/// <returns>
/// true if the identity has been authenticated; otherwise, false.
/// </returns>
public virtual bool IsAuthenticated
{
get
{
return !string.IsNullOrEmpty(this.m_authenticationType);
}
}
этот метод IsAuthenticated
используется через всю базу кода MVC, со всеми механизмами аутентификации, полагающимися на это.
также теоретически вы можете войти через несколько провайдеров и выйти только из одного из них за раз, оставив остальных провайдеров все еще аутентифицированными. Хотя я никогда не пробовал.
другое использование, которое я только что нашел-если вы не предоставляете CookieName
в конфигурации промежуточного, тогда Options.CookieName = CookieAuthenticationDefaults.CookiePrefix + Options.AuthenticationType;
(см. второй оператор if в конструкторе).
Я уверен, что есть больше мест, где он используется. Но самое главное-предоставить его и соответствовать названию, иначе вы получите тонкие ошибки в системе аутентификации.
Я не знаю всего ответа, но у меня есть пример того, что это б быть полезным для.
У меня есть многопользовательский веб-сайт: веб-сайт работает как один экземпляр с несколькими доменами. Каждый домен является отдельным арендатором (с отдельным набором пользователей). Чтобы реализовать вход в Facebook для каждого клиента, мне нужно приложение Facebook для каждого клиента. Чтобы настроить это, мне пришлось установить уникальный CallbackPath и уникальный AuthenticationType в арендатор:
var facebookOptions = new FacebookAuthenticationOptions
{
AuthenticationType = "Facebook-{tenantID}",
CallbackPath = new PathString($"/signin-facebook-{tenantID}")
}
Я думал, что он также используется как имя cookie, но это не относится к внешнему логину, такому как FacebookAuthentication. Я заметил, что это значение AuthenticationType появилось при запросе:
- в IdentityUserLogin.LoginProvider через authenticationManager.GetExternalLoginInfoAsync ()
- AuthenticationDescription.AuthenticationType через authenticationManager.GetExternalAuthenticationTypes () (кажется логично ;-))
- В IdentityUserLogin.LoginProvider для каждого пользователя.Логинов (аналогично 1)
и последнее, но не менее важное: значение AuthenticationType хранится в столбце базы данных AspNetUserLogins.LoginProvider.
Если вы настроили свежий asp.net решение, стандартный код настройки (в отличие от кода, скопированного из другого приложения) при запуске.Auth включает в себя строку AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
это создает файл cookie (с именем по умолчанию.сеть САШ.ApplicationCookie), который вы можете увидеть, если вы посмотрите в активном списке cookie Вашего браузера, который используется (среди прочего), чтобы проверить, аутентифицируется ли пользователь для каждого запроса. Если cookie нет (или пользователь находится в каким - то образом не аутентифицируется), промежуточное ПО перенаправляет на маршрут, указанный в вашей строке LoginPath = new PathString("/Login/"),
тот факт, что эта строка закомментирована в вашем коде, и ваше приложение работает, предполагает, что в вашем коде есть какая-то другая нестандартная конфигурация для аутентификации пользователя. Если раскомментировать эту строку и войти успешно, но перенаправляет обратно в login, это говорит о том, что существует некоторый конфликт между нестандартным кодом и промежуточным ПО, что приводит к промежуточному по определяя, что пользователь не прошел проверку, и получает перенаправлены обратно на LoginPath.
Я хотел бы выяснить, есть ли нестандартный код аутентификации в вашем приложении и определить, что это конкретно делает, и ответ на конфликт должен представляться. Общий совет - не изменять стандартный код аутентификации, если вы точно не знаете, каковы последствия этого (и это может усложниться, с большим количеством ловушек для неосторожный.)
в частности, на ваш вопрос, эта опция не просто полезна, она имеет основополагающее значение для стандартной работы промежуточного программного обеспечения Identity. Похоже, в вашем приложении есть нестандартный код. Если это так, вы должны полностью определить, что он делает (и это последствия) в отношении безопасности входа в систему или вернуться к стандартному идентификационному коду, если сможете.