Почему Identity Server4 Logout не работает?(без идентификатора MS) - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь реализовать свой собственный OAuth-сервер с IdentityServer4, и пока все работает, кроме выхода из системы.

Я не использую Microsoft Identity, поскольку у меня уже есть существующее WebApp с WebApi, которое обрабатывает связанные с пользователем операции CRUD.Таким образом, я использую существующую базу данных для извлечения пользователей и проверки их имени пользователя и PW.Если проверка прошла успешно, мой метод проверки возвращает объект типа «AuthenticatedUser» (который я создал в UtilityClass).

Редактировать Мой клиент - приложение Xamarin, использующее IdentityModel.OidcClient2для входаЯ тестирую на платформе UWP, Edit , которая использует WebAuthenticationBroker для вызовов входа / выхода.

Код, который я использую, взят из примера пользовательского интерфейса QuickStart с небольшой модификацией для проверки пользователей из моей существующей БД: Редактировать Теперь я явно создаю Claims, ClaimsIdentity и добавил CookieAuthenticationDefaults.AuthenticationScheme везде, где это возможно.

//my method for user validation
AuthenticatedUser user = await _userService.ValidateCredentials(model.Username, model.Password);

//rest of login code from quickstart ui
if (user != null) 
{ 
    await _events.RaiseAsync(new UserLoginSuccessEvent(user.FirstName, user.Id.ToString(), user.FirstName));

    // only set explicit expiration here if user chooses "remember me". 
    // otherwise we rely upon expiration configured in cookie middleware.
    AuthenticationProperties props = null;
    if (AccountOptions.AllowRememberLogin && model.RememberLogin)
    {
        props = new AuthenticationProperties
         {
        IsPersistent = true,
        ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)
        };
    };

    //things we know about the user that we wish to store on the cookie
    var claims = new List<Claim>
    {
        new Claim(JwtClaimTypes.Role, user.RoleId.ToString()),
        new Claim(JwtClaimTypes.Name, user.FirstName + " " + user.LastName),
        new Claim(JwtClaimTypes.Subject, user.Id.ToString())
    };        

    var userIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

    ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);

    //set the cookie using the SignInAsync method
    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, props);
    // issue authentication cookie with subject ID and username
    await HttpContext.SignInAsync(user.Id.ToString(), user.FirstName, props);

    //....

Пока, похоже, это работает хорошо.Когда происходит сбой входа в систему, я не могу получить доступ к своему защищенному Api, в случае успешного входа в систему я получаю AccessToken с запрошенными заявками и могу получить доступ к защищенным методам Api, как и ожидалось.

Когда я вызываю конечную точку выхода из системы(выполняется HTTP-запросом к конечной точке, предоставляя id_token_hint в качестве параметра запроса), однако по какой-то причине пользователь не аутентифицирован - поэтому мой пользователь никогда не выходит из системы с помощью вызова HttpContext.SignOutAsync ().

        if (User?.Identity.IsAuthenticated == true) //always evaluates to false?! why?
        {
            // delete local authentication cookie
            await HttpContext.SignOutAsync();

            // raise the logout event
            await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()));
        }

Редактировать После использования WebAuthenticationBroker вместо простого HTTP-запроса для вызова конечной точки выхода из системы консоль регистрирует хотя состояние, что «XamarinApp» вышел из системы.Хотя HttpContext.SignOutAsync () никогда не вызывался. Что это значит?Я сомневаюсь, что это нормально, но впоследствии приложение ведет себя так, как я хочу, например, я могу войти в систему с новым пользователем.

[16:43:12 Debug] IdentityServer4.Hosting.EndpointRouter
Request path /connect/endsession matched to endpoint type Endsession

[16:43:12 Debug] IdentityServer4.Hosting.EndpointRouter
Endpoint enabled: Endsession, successfully created handler: IdentityServer4.Endpoints.EndSessionEndpoint

[16:43:12 Information] IdentityServer4.Hosting.IdentityServerMiddleware
Invoking IdentityServer endpoint: IdentityServer4.Endpoints.EndSessionEndpoint for /connect/endsession

[16:43:12 Debug] IdentityServer4.Endpoints.EndSessionEndpoint
Processing signout request for anonymous

[16:43:12 Debug] IdentityServer4.Validation.EndSessionRequestValidator
Start end session request validation

[16:43:12 Debug] IdentityServer4.Validation.TokenValidator
Start identity token validation

[16:43:12 Debug] IdentityServer4.EntityFramework.Stores.ClientStore
xamarinApp found in database: True

[16:43:12 Debug] IdentityServer4.Validation.TokenValidator
Client found: xamarinApp / Xamarin App

[16:43:12 Debug] IdentityServer4.Validation.TokenValidator
Calling into custom token validator: IdentityServer4.Validation.DefaultCustomTokenValidator

[16:43:12 Debug] IdentityServer4.Validation.TokenValidator
Token validation success
{
  //Token details omitted here for the sake of simplicity. 
  }
}

[16:43:12 Information] IdentityServer4.Validation.EndSessionRequestValidator
End session request validation success
{
  "ClientId": "xamarinApp",
  "ClientName": "Xamarin App",
  "SubjectId": "unknown",
  "PostLogOutUri": "xamarinformsclients://callback",
  "Raw": {
    "id_token_hint": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjA3RjlGQ0VFRTVCMzM4ODkzODZCNjc2MTZCRjZCOTFEMUEwRkRBQjAiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJCX244N3VXek9JazRhMmRoYV9hNUhSb1AyckEifQ.eyJuYmYiOjE1Mjg5MDA5ODYsImV4cCI6MTUyODkwMTI4NiwiaXNzIjoiaHR0cHM6Ly9sYXB0b3AtMW0waW4zMW46NDQzODciLCJhdWQiOiJ4YW1hcmluQXBwIiwibm9uY2UiOiI4YjZjZWRkMDFhMjQ0ZDJmOWY3ZGM4NzZmM2NmZGYwNiIsImlhdCI6MTUyODkwMDk4NiwiYXRfaGFzaCI6IkZualBtd2hiZTNmOVRITjEzM0NSZWciLCJzaWQiOiJkMmJlZTgyYzg0YWY2NGI5ZDUyYmZlNmExNmU1MTNmZiIsInN1YiI6IjI4IiwiYXV0aF90aW1lIjoxNTI4OTAwOTgzLCJpZHAiOiJsb2NhbCIsInVzZXJfaWQiOiIyOCIsInJvbGVfaWQiOiI0IiwibmFtZSI6IlRpbGwgU2F1YmVybWFubiIsImZhbWlseV9uYW1lIjoiU2F1YmVybWFubiIsImFtciI6WyJwd2QiXX0.ZjwL8nuq-WD3D-pXruZtE_I5TyNNO_ZMabz2JiKVnTaTnITwGV5CIJcLcWSpBCOyaSFXKUicAtROeWLReuk_LWoUTKXcX7lyv5VP9-ItBNA13EwgsbhQX7BgS2lbE9fQU7OgGARJcpvPKaT9FabFtEZsNYW9sNeBo-6CUPkYtVH_rjRyLihFi2NlZlkHBc7_oPE0hsjf61QIwyGZEhVXvDXkP_Q9t_Bfr3_QrUF6MfyhzLs0KcMwbtlWUxYw51J8phz7RPUXbbiZ1tG9Ay4DNy8RZbzfI-uFAbrqH7waLo_f5JO15eYc-xICl22ZS_4lW0_MlzP_rq46PnGOwNBqlg",
    "post_logout_redirect_uri": "xamarinformsclients://callback"
  }
} 

Редактировать Насколько я понимаю, этовероятно, связано с моим клиентом Xamarin и файлами cookie.Я нашел руководства по настройке клиента MVC, IDSVR4 и промежуточного программного обеспечения cookie, но ничего не касалось нативных приложений, IDSVR4 и промежуточного программного обеспечения cookie.

Как IDSVR4 (или, в частности, выход из системы) должен работать с клиентом, отличным от MVC, и IdentityModel.OidcClient?

1 Ответ

0 голосов
/ 07 августа 2018

Наконец я нашел причину.В примерах QuickstartUI класс "AccountConteroller.cs" устанавливает явное истечение срока действия только в том случае, если пользователь выбирает параметр "запомнить меня".Я удалил условие if, и, наконец, файл cookie аутентификации правильно сохранен, при выходе мой пользователь больше не равен нулю, и все в порядке.

class AccountController
...

AuthenticationProperties props = null;
//ALWAYS SET EXPLICIT EXPIRATION, SO COOKIE CAN BE DELETED WHEN LOGGING OUT
//if (AccountOptions.AllowRememberLogin && model.RememberLogin)
//{
    props = new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)
    };

//};

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...