Обновите файл идентификации для идентификации, чтобы избежать выхода из системы - PullRequest
0 голосов
/ 31 октября 2018

Я работаю над приложением ASP.NET Core 2.0 с Identity для управления подключениями пользователей.

У меня есть несколько собственных Менеджеров, Магазинов и Провайдеров для нужд моего приложения:

services.AddIdentity<Utilisateur, Profil>().AddUserManager<CustomUserManager<Utilisateur>>().AddRoleManager<CustomRoleManager>().AddDefaultTokenProviders();
services.AddTransient<IUserStore<Utilisateur>, UserStore>();
services.AddTransient<IRoleStore<Profil>, ProfileStore>();
services.AddTransient<IPermissionProvider, PermissionProvider>();

Я установил cookie-файл приложения для аутентификации Identity:

app.UseAuthentication();

А

services.ConfigureApplicationCookie(options =>
        {
            // Cookie settings
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
            // If the LoginPath isn't set, ASP.NET Core defaults the path to /Account/Login.
            options.LoginPath = new PathString("/Connexion/Login");
            options.LogoutPath = new PathString("/Connexion/SignedOut");
            // If the AccessDeniedPath isn't set, ASP.NET Core defaults the path to /Account/AccessDenied.
            options.AccessDeniedPath = new PathString("/Connexion/AccessDenied");
            options.SlidingExpiration = true;
        });

Проблема в том, что пользователь автоматически отключается через 30 минут, даже если он не находится в режиме ожидания и использует приложение в данный момент.

Как я могу обновить или заново создать файл cookie для аутентификации, чтобы избежать этой проблемы?

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

    [HttpPost]
    [RefreshLogin]
    [RequiresPermission("Pages.Modification")]
    public IActionResult SavePagesOrder() 
    {...}

и метод:

public class RefreshLoginAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext context, Microsoft.AspNetCore.Mvc.Filters.ActionExecutionDelegate next)
    {
        await context.HttpContext.RefreshLoginAsync();

        await next();
    }
}

У вас есть идея решить мою проблему?

1 Ответ

0 голосов
/ 31 октября 2018

Вот решение, которое я использовал с IdentityServer 4. Извините, это может быть грязно, но я надеюсь, что вы поняли суть. Здесь каждый раз, когда вы проверяете принципал, вы можете переписать свой доступ и обновить токен в куки.

services.AddAuthentication(options =>
                {
                    options.DefaultScheme = "Cookies";
                    options.DefaultChallengeScheme = "oidc";
                })
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
                {
                    options.Events = new CookieAuthenticationEvents
                    {
                        OnValidatePrincipal = async x =>
                        {
                            var now = DateTimeOffset.UtcNow;
                            var timeElapsed = now.Subtract(x.Properties.IssuedUtc.Value);
                            var timeRemaining = x.Properties.ExpiresUtc.Value.Subtract(now);

                            if (timeElapsed > timeRemaining)
                            {
                                var discoveryResponse = await DiscoveryClient.GetAsync(gatewaySettings.IdentitySeverAddress);
                                if (discoveryResponse.IsError)
                                {
                                    throw new Exception(discoveryResponse.Error);
                                }

                                var identity = (ClaimsIdentity) x.Principal.Identity;
                                var accessTokenClaim = identity.FindFirst("access_token");
                                var refreshTokenClaim = identity.FindFirst("refresh_token");

                                var tokenClient = new TokenClient(discoveryResponse.TokenEndpoint, "MyApi", "secret");

                                var refreshToken = refreshTokenClaim.Value;

                                var tokenResponse = await tokenClient.RequestRefreshTokenAsync(refreshToken);

                                if (!tokenResponse.IsError)
                                {
                                    identity.RemoveClaim(accessTokenClaim);
                                    identity.RemoveClaim(refreshTokenClaim);

                                    identity.AddClaims(new[]
                                    {
                                        new Claim("access_token", tokenResponse.AccessToken),
                                        new Claim("refresh_token", tokenResponse.RefreshToken)
                                    });
                                    x.ShouldRenew = true;
                                }
                            }
                        }
                    };
                })

Может быть, это как-то вам поможет.

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