Позволяет ли SignInAsAuthenticationType получить токен OAuth без перезаписи существующих требований?

Мне нужно, чтобы пользователь заходил на сайт с использованием автоматической проверки подлинности на Facebook. Теперь мне нужно установить ссылку на пользовательский диск в Google (и другие службы). Я хочу использовать ASP.Net Identity OAuth Identity для обработки обмена токенами, НО я не хочу, чтобы он касался существующего UserCredential или использовал его для SignIn UserPrincipal

Моя цель - предотвратить

  • AuthenticateCoreAsync от возврата a AuthenticationTicket, что приводит к модификации текущего зарегистрированного идентификатора пользователя
  • Пользователь сокращает систему аутентификации, используя претензии, полученные от Google. (Я должен был уже зарегистрировать пользователя с помощью других средств)
  • Предотвратить использование неожиданного токена/файла cookie для создания допустимого сеанса, создающего сценарий эскалации привилегий?

Вопрос

  • Какое влияние оказывает установка пользовательского свойства grantIdentity на IOwinContext.Authentication.SignIn()?

  • Решает ли SignInAsAuthenticationType мою потребность?

  • Если нет, когда это будет использоваться?

Теоретический код с использованием поставщика Google

// The cookie needs to be First in the chain.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "CustomExternal",
    AuthenticationMode = AuthenticationMode.Passive,
    CookieName = "MyAwesomeCookie",
    ExpireTimeSpan = TimeSpan.FromMinutes(5),
    //Additional custom cookie options....
});

//Note that SignInAsAuthenticationType == AuthenticationType
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
{
    AuthenticationType = "GoogleBackOffice",
    ClientId = "abcdef...",
    ClientSecret = "zyxwv....",
    SignInAsAuthenticationType = "CustomExternal"
});

Ответ 1

Шаблон индивидуальных учетных записей Visual Studio 2015 MVC делает что-то вроде этого. Вы создаете свою первую учетную запись (с локальным именем пользователя и паролем или удаленным провайдером), а затем вы можете связать другие идентификаторы с этим. Он связывает это, поддерживая два файла cookie во время входа в систему, один для приложения и один для внешнего идентификатора.

Если вы посмотрите в ManageController в LinkLoginCallback, вы сможете настроить логику в этой точке, чтобы сохранить внешние маркеры идентификации, но не предоставлять ей доступ к вашему приложению.

Другими словами, логику, подобную этой, следует управлять на уровне авторизации в логике вашего контроллера, а не на уровне аутентификации в промежуточном программном обеспечении auth.

Ответ 2

Если ClaimsPrincipal.Identity.IsAuthenticated является ложным, тогда пользователю будет предложена страница входа.