Подтвердить что ты не робот

UseCookieAuthentication против UseExternalSignInCookie

Я использую Owin для авторизации через Google oAuth. Вот как настроены мои файлы cookie:

// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Authentication/Login")
});
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

Я использую как UseCookieAuthentication, так и UseExternalSignInCookie, и кажется лишним. Какой из этих двух типов проверки подлинности следует указать для методов IAuthenticationManager (SignIn, SingOUt и т.д.)? Или я должен держать только один из них?

Обновление. Что меня больше смущает, так это метод SignIn:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}

Значит, вызывается из ExternalCookie, но появляется в ApplicationCookie.

4b9b3361

Ответ 1

Вам нужны все они, если вы хотите, чтобы Google подписал контракт на работу. Вот как это работает. В конвейере OWIN у вас есть три компонента промежуточного программного обеспечения: (1) промежуточное программное обеспечение проверки подлинности cookie, работающее в активном режиме, (2) другой экземпляр промежуточного программного обеспечения для аутентификации cookie, но работает в пассивном режиме и (3) промежуточное программное обеспечение для проверки подлинности Google. Это будет так.

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    ...
}); // Active

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Passive

app.UseGoogleAuthentication(...);

Когда есть 401, ваш пользователь перенаправляется в Google. Там ваш пользователь входит в систему, и Google проверяет учетные данные. Затем Google перенаправляет пользователя обратно в ваше приложение. На этом этапе промежуточное ПО аутентификации Google получает информацию о входе в систему, применяет грант (читает внешний файл cookie) и замыкает конвейер OWIN и перенаправляет на внешний URL обратного вызова, что соответствует методу ExternalLoginCallback действия AccountController. Итак, в этот момент, когда запрос приходит в ваше приложение в результате перенаправления, вы получаете внешний файл cookie с именем пользователя и сообщениями по электронной почте.

Чтобы прочитать этот файл cookie и получить данные (имя пользователя и т.д.) из Google, вы используете промежуточное ПО аутентификации cookie, работающее в пассивном режиме. Поскольку это промежуточное программное обеспечение работает в пассивном режиме, ему следует сказать, чтобы прочитать файл cookie. Это происходит при вызове AuthenticationManager.GetExternalLoginInfoAsync() в методе действий ExternalLoginCallback. В этот момент была установлена ​​личность из внешнего cookie, и этот идентификатор содержит только имена и сообщения электронной почты от Google.

Как правило, на этом этапе вам нужно будет получить информацию о пользователях из вашего хранилища данных приложений и добавить дополнительные требования к идентификатору. Таким образом, вы вызываете Signout на внешнем промежуточном программном обеспечении cookie, что также гарантирует, что внешний файл cookie больше не будет отправлен обратно, истек его. Таким образом, используя идентификационную информацию, доступную в это время, UserManager.FindAsync вызывается в методе действий ExternalLoginCallback, который должен возвращать пользователя со всеми заявками конкретного приложения. Используя этот новый идентификатор, вы вызываете SignIn в промежуточном программном обеспечении проверки подлинности cookie, запущенном в активном режиме. Это гарантирует создание нового файла cookie. По сравнению с внешним файлом cookie этот новый файл cookie содержит все заявки, относящиеся к конкретным приложениям. Впоследствии вы возвращаете этот файл cookie, а промежуточное программное обеспечение аутентификации cookie, работающее в активном режиме, активно считывает файл cookie и устанавливает личность с полным списком всех заявлений, относящихся к конкретным приложениям.

Итак, если вы не вызываете Signin, вы не будете создавать этот файл cookie, содержащий все заявки, относящиеся к конкретным приложениям. Но тогда вам решать использовать какой-то другой механизм. Поведение вне коробки заключается в том, что локальный файл cookie, содержащий все заявки, специфичные для приложения, создается через этот вызов SignIn и впоследствии считывается промежуточным программным обеспечением cookie, работающим в активном режиме.

UPDATE: я создал сообщение в блоге, чтобы объяснить, как вы можете уйти, не используя два экземпляра промежуточного программного обеспечения cookie. http://lbadri.wordpress.com/2014/10/14/barebones-asp-net-mvc-google-signin-through-owin-middleware/

Ответ 2

"SignOut (DefaultAuthenticationTypes.ExternalCookie)" означает "очистка внешнего файла cookie" в соответствии с ответом Хао Кунга fooobar.com/info/122452/...

В проекте Microsoft.aspnet.identity.samples есть хорошая реализация, которую вы можете скачать с nuget. В этой реализации они используют: -

    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

"ExternalCookie" - это "Значение по умолчанию, используемое для параметра ExternalSignInAuthenticationType". Я полагаю, это означает, что он используется как временное использование файлов cookie для проверки пользователя против внешнего вида