Usar cookie autenticação sem ASP.NET Core Identity

De Rick Anderson

ASP.NET Core Identity é um provedor de autenticação completa e completo para criar e manter logons. No entanto, um cookie provedor de autenticação com base sem ASP.NET Core Identity pode ser usado. Para obter mais informações, consulte Introdução ao Identity no ASP.NET Core.

Exibir ou baixar código de exemplo (como baixar)

Para fins de demonstração no aplicativo de exemplo, a conta de usuário para o usuário hipotético, Maria Rodriguez, é codificada no aplicativo. Use o endereço de email maria.rodriguez@contoso.com e qualquer senha para conectar o usuário. O usuário é autenticado no AuthenticateUser método no arquivo pages/Account/Login. cshtml. cs . Em um exemplo do mundo real, o usuário seria autenticado em um banco de dados.

Configuração

No Startup.ConfigureServices método, crie os serviços de middleware de autenticação com os AddAuthentication AddCookie métodos e:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

AuthenticationScheme passado para AddAuthentication define o esquema de autenticação padrão para o aplicativo. AuthenticationScheme é útil quando há várias instâncias de cookie autenticação e você deseja autorizar com um esquema específico. A definição de AuthenticationScheme para Cookie AuthenticationDefaults. AuthenticationScheme fornece um valor de " Cookie s" para o esquema. Você pode fornecer qualquer valor de cadeia de caracteres que diferencie o esquema.

O esquema de autenticação do aplicativo é diferente do esquema de cookie autenticação do aplicativo. Quando um cookie esquema de autenticação não é fornecido para o AddCookie , ele usa CookieAuthenticationDefaults.AuthenticationScheme (" Cookie s").

A cookie propriedade da autenticação IsEssential é definida como true por padrão. cookieOs s de autenticação são permitidos quando um visitante do site não consentiu na coleta de dados. Para obter mais informações, consulte Suporte a Regulamento Geral sobre a Proteção de Dados (GDPR) no ASP.NET Core.

No Startup.Configure , chame UseAuthentication e UseAuthorization para definir a HttpContext.User propriedade e executar o middleware de autorização para solicitações. Chame os UseAuthentication UseAuthorization métodos e antes de chamar UseEndpoints :

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapRazorPages();
});

A CookieAuthenticationOptions classe é usada para configurar as opções do provedor de autenticação.

De CookieAuthenticationOptions acordo com a configuração de serviço para autenticação no método Startup.ConfigureServices :

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        ...
    });

Cookie O Middleware de Política habilita recursos de cookie política. Adicionar o middleware ao pipeline de processamento de aplicativos é sensível à ordem, afeta apenas os — componentes downstream registrados no pipeline.

app.UseCookiePolicy(cookiePolicyOptions);

Use fornecido para o Middleware de Política para controlar as características globais do processamento e conectar-se aos manipuladores de processamento quando s são CookiePolicyOptions Cookie cookie cookie cookie anexados ou excluídos.

O valor MinimumSameSitePolicy padrão é permitir a SameSiteMode.Lax autenticação OAuth2. Para impor estritamente uma política de mesmo site de SameSiteMode.Strict , de definir o MinimumSameSitePolicy . Embora essa configuraçãobre o OAuth2 e outros esquemas de autenticação entre origens, ela eleva o nível de segurança para outros tipos de aplicativos que não dependem do processamento de solicitações entre cookie origens.

var cookiePolicyOptions = new CookiePolicyOptions
{
    MinimumSameSitePolicy = SameSiteMode.Strict,
};

A Cookie configuração middleware de política para MinimumSameSitePolicy pode afetar a configuração de em Cookie.SameSite CookieAuthenticationOptions configurações de acordo com a matriz abaixo.

MinimumSameSitePolicy Cookie. SameSite Resultante. Cookie Configuração de SameSite
SameSiteMode.None SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode. LAX SameSiteMode. None
SameSiteMode. LAX
SameSiteMode. Strict
SameSiteMode. LAX
SameSiteMode. LAX
SameSiteMode. Strict
SameSiteMode. Strict SameSiteMode. None
SameSiteMode. LAX
SameSiteMode. Strict
SameSiteMode. Strict
SameSiteMode. Strict
SameSiteMode. Strict

Para criar cookie informações de usuário de retenção, construa um ClaimsPrincipal . As informações do usuário são serializadas e armazenadas no cookie .

Crie um ClaimsIdentity com qualquer Claim s necessário e chame SignInAsync para entrar no usuário:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

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

var authProperties = new AuthenticationProperties
{
    //AllowRefresh = <bool>,
    // Refreshing the authentication session should be allowed.

    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
    // The time at which the authentication ticket expires. A 
    // value set here overrides the ExpireTimeSpan option of 
    // CookieAuthenticationOptions set with AddCookie.

    //IsPersistent = true,
    // Whether the authentication session is persisted across 
    // multiple requests. When used with cookies, controls
    // whether the cookie's lifetime is absolute (matching the
    // lifetime of the authentication ticket) or session-based.

    //IssuedUtc = <DateTimeOffset>,
    // The time at which the authentication ticket was issued.

    //RedirectUri = <string>
    // The full path or absolute URI to be used as an http 
    // redirect response value.
};

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity), 
    authProperties);

Se você quiser ver comentários de código traduzidos para idiomas diferentes do inglês, nos avise neste problema de discussão do GitHub.

SignInAsync Cria um criptografado cookie e o adiciona à resposta atual. Se AuthenticationScheme não for especificado, o esquema padrão será usado.

RedirectUri é usado apenas em alguns caminhos específicos por padrão, por exemplo, o caminho de logon e os caminhos de logout. Para obter mais informações, consulte Cookie AuthenticationHandler source.

ASP.NET o sistema de Proteção de Dados do Core é usado para criptografia. Para um aplicativo hospedado em vários máquinas, balanceamento de carga entre aplicativos ou usando um web farm, configure a proteção de dados para usar o mesmo anel de chave e identificador de aplicativo.

Sair

Para sair do usuário atual e excluir seu cookie , chame SignOutAsync :

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

Se (ou " s") não for usado como o esquema CookieAuthenticationDefaults.AuthenticationScheme (por exemplo, "Contoso "), fornecerá o esquema usado ao Cookie configurar o provedor de Cookie autenticação. Caso contrário, o esquema padrão será usado.

Quando o navegador é fechado, ele exclui automaticamente s baseados em sessão (s não persistentes), mas nenhum s é limpo cookie quando uma guia individual é cookie cookie fechada. O servidor não é notificado sobre eventos de fechamento de tabulação ou navegador.

Reagir a alterações de back-end

Depois que cookie um é criado, cookie o é a única fonte de identidade. Se uma conta de usuário estiver desabilitada em sistemas de back-end:

  • O sistema de autenticação cookie do aplicativo continua a processar solicitações com base na autenticação cookie .
  • O usuário permanece dentro do aplicativo, desde que a autenticação cookie seja válida.

O ValidatePrincipal evento pode ser usado para interceptar e substituir a validação da cookie identidade. Validar o cookie em cada solicitação reduz o risco de usuários revogados acessarem o aplicativo.

Uma abordagem para cookie validação baseia-se em manter o controle de quando o banco de dados do usuário muda. Se o banco de dados não tiver sido alterado desde que o do usuário foi emitido, não será necessário autenticar o usuário se o usuário ainda cookie cookie for válido. No aplicativo de exemplo, o banco de dados é implementado IUserRepository no e armazena um LastChanged valor. Quando um usuário é atualizado no banco de dados, LastChanged o valor é definido como a hora atual.

Para invalidar um cookie quando o banco de dados for alterado com base no LastChanged valor, crie o cookie com uma LastChanged declaração que contém o LastChanged valor atual do banco de dados:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("LastChanged", {Database Value})
};

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

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity));

Para implementar uma substituição para o ValidatePrincipal evento, grave um método com a seguinte assinatura em uma classe derivada de CookieAuthenticationEvents :

ValidatePrincipal(CookieValidatePrincipalContext)

Veja a seguir um exemplo de implementação de CookieAuthenticationEvents :

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        // Get the database from registered DI services.
        _userRepository = userRepository;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        var userPrincipal = context.Principal;

        // Look for the LastChanged claim.
        var lastChanged = (from c in userPrincipal.Claims
                           where c.Type == "LastChanged"
                           select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !_userRepository.ValidateLastChanged(lastChanged))
        {
            context.RejectPrincipal();

            await context.HttpContext.SignOutAsync(
                CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
}

Registre a instância de eventos durante cookie o registro de serviço no Startup.ConfigureServices método. Forneça um registro de serviço com escopo para sua CustomCookieAuthenticationEvents classe:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.EventsType = typeof(CustomCookieAuthenticationEvents);
    });

services.AddScoped<CustomCookieAuthenticationEvents>();

Considere uma situação em que o nome do usuário é atualizado — uma decisão que não afeta a segurança de nenhuma forma. Se você quiser atualizar não destrutivamente a entidade de usuário, chame context.ReplacePrincipal e defina a context.ShouldRenew propriedade como true .

Aviso

A abordagem descrita aqui é disparada em cada solicitação. A validação de cookie s de autenticação para todos os usuários em cada solicitação pode resultar em uma grande penalidade de desempenho para o aplicativo.

S persistentes cookie

Talvez você queira que o cookie persista entre as sessões do navegador. Essa persistência só deve ser habilitada com consentimento de usuário explícito com uma caixa de seleção "lembrar-me" na entrada ou em um mecanismo semelhante.

O trecho de código a seguir cria uma identidade e uma correspondência cookie que sobrevivem pelos fechamentos do navegador. Todas as configurações de expiração deslizante configuradas anteriormente são respeitadas. Se a cookie expiração enquanto o navegador estiver fechado, o navegador apagará a cookie vez que ele for reiniciado.

Defina IsPersistent como true em AuthenticationProperties :

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true
    });

Um tempo de expiração absoluto pode ser definido com ExpiresUtc . Para criar um persistente cookie , IsPersistent também deve ser definido. Caso contrário, o cookie é criado com um tempo de vida baseado em sessão e pode expirar antes ou depois do tíquete de autenticação que ele contém. Quando ExpiresUtc é definido, ele substitui o valor da ExpireTimeSpan opção de , se CookieAuthenticationOptions definido.

O snippet de código a seguir cria uma identidade e cookie correspondente que dura 20 minutos. Isso ignora as configurações de expiração deslizante configuradas anteriormente.

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });

ASP.NET Core Identity é um provedor de autenticação completo e completo para criar e manter logons. No entanto, um cookie provedor de autenticação baseado em sem ASP.NET Core Identity pode ser usado. Para obter mais informações, consulte Introdução ao Identity no ASP.NET Core.

Exibir ou baixar código de exemplo (como baixar)

Para fins de demonstração no aplicativo de exemplo, a conta de usuário para o usuário hipotético, Maria Maria, é codificada no aplicativo. Use o Endereço de email e qualquer senha para entrar no maria.rodriguez@contoso.com usuário. O usuário é autenticado no AuthenticateUser método no arquivo Pages/Account/Login.cshtml.cs. Em um exemplo do mundo real, o usuário seria autenticado em um banco de dados.

Configuração

Se o aplicativo não usar o metapacote Microsoft.AspNetCore.App, crie uma referência de pacote no arquivo de projeto para Microsoft.AspNetCore.Authentication. Cookie pacote s.

No método Startup.ConfigureServices , crie o serviço middleware de autenticação com os métodos e AddAuthentication AddCookie :

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

AuthenticationScheme passado para AddAuthentication define o esquema de autenticação padrão para o aplicativo. AuthenticationScheme é útil quando há várias instâncias de cookie autenticação e você deseja autorizar com um esquema específico. Definir o AuthenticationScheme como Cookie AuthenticationDefaults.AuthenticationScheme fornece um valor de " Cookie s" para o esquema. Você pode fornecer qualquer valor de cadeia de caracteres que distingue o esquema.

O esquema de autenticação do aplicativo é diferente do esquema de autenticação cookie do aplicativo. Quando um cookie esquema de autenticação não é fornecido para AddCookie , ele usa (" CookieAuthenticationDefaults.AuthenticationScheme Cookie s").

A propriedade cookie da IsEssential autenticação é definida true como por padrão. As cookie autenticações são permitidas quando um visitante do site não consente com a coleta de dados. Para obter mais informações, consulte Suporte a Regulamento Geral sobre a Proteção de Dados (GDPR) no ASP.NET Core.

No método Startup.Configure , chame o método para invocar o UseAuthentication Middleware de Autenticação que define a HttpContext.User propriedade . Chame o UseAuthentication método antes de chamar UseMvcWithDefaultRoute ou UseMvc :

app.UseAuthentication();

A CookieAuthenticationOptions classe é usada para configurar as opções do provedor de autenticação.

Defina CookieAuthenticationOptions na configuração de serviço para autenticação no Startup.ConfigureServices método:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        ...
    });

O Cookie middleware de política habilita os cookie recursos de política. A adição do middleware ao pipeline de processamento do aplicativo é a diferenciação de ordem — que afeta apenas os componentes de downstream registrados no pipeline.

app.UseCookiePolicy(cookiePolicyOptions);

Use CookiePolicyOptions o fornecido ao Cookie middleware de política para controlar as características globais do cookie processamento e o gancho em cookie manipuladores de processamento quando cookie s forem acrescentadas ou excluídas.

O MinimumSameSitePolicy valor padrão é SameSiteMode.Lax permitir a autenticação OAuth2. Para impor estritamente uma política de mesmo site do SameSiteMode.Strict , defina o MinimumSameSitePolicy . Embora essa configuração quebre OAuth2 e outros esquemas de autenticação entre origens, ela eleva o nível de cookie segurança para outros tipos de aplicativos que não dependem do processamento de solicitação entre origens.

var cookiePolicyOptions = new CookiePolicyOptions
{
    MinimumSameSitePolicy = SameSiteMode.Strict,
};

A Cookie configuração de middleware de política para MinimumSameSitePolicy pode afetar a configuração de Cookie.SameSite em configurações de acordo com CookieAuthenticationOptions a matriz abaixo.

MinimumSameSitePolicy Cookie. SameSite Resultante Cookie . Configuração de SameSite
SameSiteMode. None SameSiteMode. None
SameSiteMode. LAX
SameSiteMode. Strict
SameSiteMode. None
SameSiteMode. LAX
SameSiteMode.Strict
SameSiteMode.Lax SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict

Para criar uma cookie informação de usuário de responsabilidade, construa um ClaimsPrincipal . As informações do usuário são serializadas e armazenadas no cookie .

Crie um ClaimsIdentity com quaisquer Claim s necessários e chame para entrar SignInAsync no usuário:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

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

var authProperties = new AuthenticationProperties
{
    //AllowRefresh = <bool>,
    // Refreshing the authentication session should be allowed.

    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
    // The time at which the authentication ticket expires. A 
    // value set here overrides the ExpireTimeSpan option of 
    // CookieAuthenticationOptions set with AddCookie.

    //IsPersistent = true,
    // Whether the authentication session is persisted across 
    // multiple requests. When used with cookies, controls
    // whether the cookie's lifetime is absolute (matching the
    // lifetime of the authentication ticket) or session-based.

    //IssuedUtc = <DateTimeOffset>,
    // The time at which the authentication ticket was issued.

    //RedirectUri = <string>
    // The full path or absolute URI to be used as an http 
    // redirect response value.
};

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity), 
    authProperties);

SignInAsync cria um criptografado cookie e adiciona-o à resposta atual. Se AuthenticationScheme não for especificado, o esquema padrão será usado.

O sistema de proteção de dados de ASP.NET Core é usado para criptografia. Para um aplicativo hospedado em vários computadores, balanceamento de carga entre aplicativos ou usando um web farm, Configure a proteção de dados para usar o mesmo token de chave e identificador de aplicativo.

Sair

Para desconectar o usuário atual e excluir seu cookie , chame SignOutAsync :

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

Se CookieAuthenticationDefaults.AuthenticationScheme (ou " Cookie s") não for usado como o esquema (por exemplo, "Contoso Cookie "), forneça o esquema usado ao configurar o provedor de autenticação. Caso contrário, o esquema padrão será usado.

Reagir a alterações de back-end

Depois que um cookie é criado, o cookie é a única fonte de identidade. Se uma conta de usuário estiver desabilitada em sistemas back-end:

  • O sistema de cookie autenticação do aplicativo continua processando solicitações com base na autenticação cookie .
  • O usuário permanece conectado ao aplicativo, contanto que a autenticação cookie seja válida.

O ValidatePrincipal evento pode ser usado para interceptar e substituir a validação da cookie identidade. A validação do cookie em cada solicitação reduz o risco de usuários revogados acessarem o aplicativo.

Uma abordagem para a cookie validação é baseada na manutenção do controle quando o banco de dados do usuário é alterado. Se o banco de dados não tiver sido alterado desde que o usuário cookie foi emitido, não haverá necessidade de autenticar novamente o usuário se ele cookie ainda for válido. No aplicativo de exemplo, o banco de dados é implementado no IUserRepository e armazena um LastChanged valor. Quando um usuário é atualizado no banco de dados, o LastChanged valor é definido como a hora atual.

Para invalidar um cookie quando o banco de dados for alterado com base no LastChanged valor, crie o cookie com uma LastChanged declaração que contém o LastChanged valor atual do banco de dados:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("LastChanged", {Database Value})
};

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

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity));

Para implementar uma substituição para o ValidatePrincipal evento, grave um método com a seguinte assinatura em uma classe derivada de CookieAuthenticationEvents :

ValidatePrincipal(CookieValidatePrincipalContext)

Veja a seguir um exemplo de implementação de CookieAuthenticationEvents :

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        // Get the database from registered DI services.
        _userRepository = userRepository;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        var userPrincipal = context.Principal;

        // Look for the LastChanged claim.
        var lastChanged = (from c in userPrincipal.Claims
                           where c.Type == "LastChanged"
                           select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !_userRepository.ValidateLastChanged(lastChanged))
        {
            context.RejectPrincipal();

            await context.HttpContext.SignOutAsync(
                CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
}

Registre a instância de eventos cookie durante o registro de serviço no método Startup.ConfigureServices . Forneça um registro de serviço com escopo para sua CustomCookieAuthenticationEvents classe:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.EventsType = typeof(CustomCookieAuthenticationEvents);
    });

services.AddScoped<CustomCookieAuthenticationEvents>();

Considere uma situação em que o nome do usuário é atualizado, uma decisão que — não afeta a segurança de forma alguma. Se você quiser atualizar a entidade de usuário de forma não destrutiva, chame context.ReplacePrincipal e de definir a propriedade como context.ShouldRenew true .

Aviso

A abordagem descrita aqui é disparada em cada solicitação. Validar a cookie autenticação para todos os usuários em cada solicitação pode resultar em uma grande penalidade de desempenho para o aplicativo.

cookieS persistentes

Talvez você queira que cookie o persista entre as sessões do navegador. Essa persistência só deve ser habilitada com o consentimento explícito do usuário com uma caixa de seleção "Lembre-se de mim" ao entrar ou um mecanismo semelhante.

O snippet de código a seguir cria uma identidade e correspondente cookie que sobrevive por meio de fechamentos do navegador. Todas as configurações de expiração deslizante configuradas anteriormente são adida. Se o cookie expirar enquanto o navegador estiver fechado, o navegador limpará o cookie depois que ele for reiniciado.

De IsPersistent definido como em true AuthenticationProperties :

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true
    });

Um tempo de expiração absoluto pode ser definido com ExpiresUtc . Para criar um cookie persistente, IsPersistent também deve ser definido. Caso contrário, o será criado com um tempo de vida baseado em sessão e poderá expirar antes ou depois do tíquete de cookie autenticação que ele contém. Quando ExpiresUtc é definido, ele substitui o valor da ExpireTimeSpan opção de , se CookieAuthenticationOptions definido.

O snippet de código a seguir cria uma identidade e cookie correspondente que dura 20 minutos. Isso ignora as configurações de expiração deslizante configuradas anteriormente.

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });

Recursos adicionais