【问题标题】:Cookie not expiring for Azure AD authAzure AD 身份验证的 Cookie 不会过期
【发布时间】:2020-02-02 04:30:39
【问题描述】:

我正在向 ASP.NET Core 应用程序添加 Azure AD 身份验证。应用程序在 Azure AD 中注册,并在清单中设置了自定义角色。这些角色用于应用程序内的授权策略。当用户登录时一切正常,他们被重定向到登录 Azure 并返回包含其声明的 Cookie。

我的问题是,除非在浏览器中删除 Cookie,否则这些声明会持续存在,并且不会在 Azure 中的角色更改时刷新。例如,如果用户登录,然后我将他们从角色中删除,他们仍将被应用程序视为在该角色中。

我尝试将 Cookie 的有效期设置为 1 分钟,但它没有影响,我仍然遇到同样的问题。这是在Startup 中配置身份验证的方式。 (AddAzureAd() 来自这个例子:https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-aspnetcore/blob/master/Extensions/AzureAdAuthenticationBuilderExtensions.cs):

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddAzureAd(options =>
{
    options.ClientId = azureAdOptions.ClientId;
    options.ClientSecret = azureAdOptions.ClientSecret;
    options.Instance = azureAdOptions.Instance;
    options.Domain = azureAdOptions.Domain;
    options.TenantId = azureAdOptions.TenantId;
    options.CallbackPath = azureAdOptions.CallbackPath;
})
.AddCookie(options =>
{
    options.Cookie.Expiration = TimeSpan.FromMinutes(1);
    options.ExpireTimeSpan = TimeSpan.FromMinutes(1);
});

更新:在 Cookie 配置中将 Expires 更改为 MaxAge 会在浏览器中为浏览器中的 Cookie 设置一个 Max Age,并且该浏览器可以正常工作。但是为什么ExpireTimeSpan 不做任何事情并接受超过 1 分钟的 Cookie?

Cookie 选项更新为:

.AddCookie(options =>
{
    options.Events.OnSignedIn = async e =>
    {
        e.Properties.IsPersistent = true;
        e.Properties.ExpiresUtc = DateTime.UtcNow.AddMinutes(1);
    };
});

但它仍然接受更早的 Cookie。如果我登录,请在页面上停留 5 分钟,然后刷新它使用相同的 cookie 进行身份验证。角色等未更新。

【问题讨论】:

    标签: c# asp.net-core cookies azure-active-directory


    【解决方案1】:

    如果要控制身份验证票证的生命周期,可以使用:

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    
    services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
    {
        options.UseTokenLifetime = false;
        ...
    
    });
    
    services.Configure<CookieAuthenticationOptions>(AzureADDefaults.CookieScheme, options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromMinutes(1);
        ...
    
    });
    

    这样1分钟后,ticket过期,在页面请求时,会向AAD发送授权请求,如果AAD用户处于活动状态,它会自动再次登录以获取新令牌并映射到用户声明.

    【讨论】:

    • falseUseTokenLifetime 的默认值,我最初尝试了ExpireTimeSpan 设置。
    • 你试过我的代码了吗?任何结果。这适用于我的测试。
    • 是的,我还有一些其他的东西必须拿出来,但它似乎正在做我现在需要的。
    【解决方案2】:

    但是为什么 ExpireTimeSpan 不做任何事情并接受超过 1 分钟的 Cookie?

    absolute expiration time 可以用ExpiresUtc 设置。要创建持久 cookie,还必须设置 IsPersistent。否则,cookie 将使用基于会话的生命周期创建,并且可能在其持有的身份验证票证之前或之后过期。当设置ExpiresUtc 时,它覆盖了ExpireTimeSpan 选项的值

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

    存储在 cookie 中的身份验证票证过期的时间跨度。 ExpireTimeSpan 添加到当前时间以创建工单的到期时间。 ExpiredTimeSpan 值始终进入由服务器验证的加密 AuthTicket。 它也可能进入 Set-Cookie 标头,但前提是设置了 IsPersistent。 要将 IsPersistent 设置为 true,请配置传递给 SignInAsync 的 AuthenticationProperties。 ExpireTimeSpan 的默认值为 14 天。

    【讨论】:

    • 谢谢,更进一步。不过,服务器上似乎仍然没有过期。
    猜你喜欢
    • 2012-01-30
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2021-11-26
    • 2019-10-15
    相关资源
    最近更新 更多