Справочная информация:
- Мое приложение имеет собственную базовую систему входа в систему (информация пользователя сохранена в дБ)
Теперь я хочу добавить функцию единого входа Microsoft, используя рабочий процесс OpenID connect и использую Microsoft в качестве поставщика аутентификации.
Мне также нужна функция единого выхода, поэтому я регистрирую logout url
для приложения в Azure.
Пользовательский опыт:
- Если пользователь входит в систему с помощью единого входа Microsoft, при выходе он / она активирует единый выход, при котором пользователь выходит из системы.из всех его / ее подписанных в приложении Microsoft - идеально
- Если пользователь выполняет вход не через единый вход Microsoft, а просто обычным способом, когда нажимается кнопка «Выход», единый выход такжесработало - сбивает с толку
My startup.cs
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
PostLogoutRedirectUri = postLogoutRedirectUri,
RedirectUri = redirectUri,
Authority = Authority,
Notifications =
new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = OwinStartup.AuthorizationCodeRecieved,
AuthenticationFailed = OwinStartup.AuthenticationFailed,
RedirectToIdentityProvider = OwinStartup.RedirectToIdentityProvider,
SecurityTokenValidated = OwinStartup.SecurityTokenValidated,
},
});
Код срабатывает при нажатии кнопки выхода из системы:
var authTypes = Request.GetOwinContext().Authentication.GetAuthenticationTypes().Select(o => o.AuthenticationType).ToArray();
Request.GetOwinContext().Authentication.SignOut(authTypes);
Причина, по которой я считаюпоскольку OpenID
authenticationType
регистрируется в автозагрузке, независимо от того,позже пользователь будет использовать какой метод для входа, поэтому выход из системы всегда будет вызывать единый выход. (выход выполняется для всех доступных типов)
Я не знаю, как не запускать единый выход припользователь не вошел в систему через Microsoft, я попытался закомментировать PostLogoutRedirectUri
, но это не сработало.Текущий обходной путь - это не выход из типа аутентификации openID
.Но я чувствую, что эта работа не правильная.
var authTypes = Request.GetOwinContext().Authentication.GetAuthenticationTypes().Select(o => o.AuthenticationType);
var authTypesExceptOpenId = authTypes.Where(a => a != "OpenIdConnect").ToArray();
Request.GetOwinContext().Authentication.SignOut(authTypesExceptOpenId );