#asp.net #asp.net-mvc #asp.net-core #asp.net-identity #identityserver4
#asp.net #asp.net-mvc #asp.net-core #asp.net-идентификация #identityserver4
Вопрос:
в неосновном приложении asp mvc у меня было действие контроллера для глобального выхода пользователя из системы
это выглядело так
public ActionResult Logout()
{
Request.GetOwinContext().Authentication.SignOut();
return Redirect("/");
}
теперь у меня есть клиент asp core, и я хочу выйти из системы, которую я пробовал
public async Task<ActionResult> LogOut()
{
if (User.Identity.IsAuthenticated)
{
await HttpContext.Authentication.SignOutAsync("Cookies");
}
return Redirect("/");
}
Обновить
Теперь кажется, что я получаю выход из системы, но я перенаправляюсь на сайт, который требует авторизации. Я вижу, что вскоре я снова перенаправляюсь на сервер идентификации, который автоматически отправляет меня снова.
Вкратце: я выхожу из системы в своем приложении asp, но не на сервере идентификации.
Как я могу выполнить глобальный выход? Так что, мне нужно выйти из системы на сервере идентификации?
Ответ №1:
Если вы используете OpenIdConnect
аутентификацию, вам также потребуется удаленный выход. Попробуйте изменить свой код примерно так, как показано ниже:
public async Task<ActionResult> LogOut()
{
if (User.Identity.IsAuthenticated)
{
await HttpContext.Authentication.SignOutAsync("Cookies");
await context.Authentication.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties()
{
RedirectUri = "<signed out url>"
});
// if you use different scheme name for openid authentication, use below code
//await context.Authentication.SignOutAsync(<your openid scheme>, new AuthenticationProperties()
//{
// RedirectUri = "/signedout"
//});
}
return Redirect("/");
}
Смотрите оригинальный пример https://github.com/aspnet/Security/blob/dev/samples/OpenIdConnectSample/Startup.cs
Ответ №2:
Я столкнулся с той же проблемой, и для ее решения мне пришлось самостоятельно очистить файлы cookie ответа в моем приложении IdentityServer.
var cookies = HttpContext.Request.Cookies.Keys;
foreach (var cookie in cookies)
{
HttpContext.Response.Cookies.Delete(cookie, new CookieOptions
{
Domain = "localhost" // Your host name here
});
}
// SignOutAsync depends on IdentityServer4 > Microsoft.AspNetCore.Http.Authentication
await HttpContext.Authentication.SignOutAsync();
Что я сделал, так это то, что когда мой клиент хочет выйти из системы, я перенаправляю его в свое приложение IdentityServer, которое очищает файлы cookie ответа, как указано выше.
В этом коде я удаляю все файлы cookie для localhost
, однако вы можете добавить туда фильтр и удалить только файлы cookie, которые IdentityServer использует для сохранения аутентификации пользователя.
Ниже вы найдете более подробную информацию об этой реализации.
http://benjii.me/2016/04/single-sign-out-logout-identity-server-4/
Ответ №3:
Вот официальная документация для ASP.NET Единый выход сервера идентификации:
документация по единому выходу
Это пример, взятый из их демонстрационной реализации:
public ActionResult Signout()
{
Request.GetOwinContext().Authentication.SignOut();
return Redirect("/");
}
public void SignoutCleanup(string sid)
{
var cp = (ClaimsPrincipal)User;
var sidClaim = cp.FindFirst("sid");
if (sidClaim != null amp;amp; sidClaim.Value == sid)
{
Request.GetOwinContext().Authentication.SignOut("Cookies");
}
}
Комментарии:
1. Я бы сказал, что в данном контексте это бесполезно, поскольку мы говорим о приложении AspNetCore и используем библиотеки OWIN в управляемом коде. Однако он отлично работает в не asp.net основное приложение, использующее OWIN.