使用Azure在OpenIdConnect中实现滑动过期

时间:2018-01-31 19:04:23

标签: c# asp.net-mvc authentication azure-active-directory openid-connect

我们有一个ASP.Net MVC,并且一直在使用Azure AD作为权限进行OpenIdConnect身份验证。在成功验证后,我们设置了" AuthenticationTicket"到期8小时(以下我已经设置为15分钟进行测试)。这8小时是固定的,这意味着即使用户在应用程序上执行活动,它也不会滑动。

但理想情况下,我们希望在用户对系统处于活动状态时过期。

尝试过设置" SlidingExpiration"真的,即使这没有帮助。本主题并未详细说明文档。

那么,我们如何使用OpenIdConnect身份验证实现滑动过期?

以下是我们的启动代码。

namespace TestApp
{
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                CookieManager = new SystemWebCookieManager(),
                SlidingExpiration = true,
            });

            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = clientId,
                    Authority = Authority,
                    PostLogoutRedirectUri = postLogoutRedirectUri,                    
                    Notifications = new OpenIdConnectAuthenticationNotifications()
                    {
                        //
                        // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
                        //
                        AuthorizationCodeReceived = (context) =>
                        {

                            context.AuthenticationTicket.Properties.ExpiresUtc = DateTime.UtcNow.AddHours(8);
                            context.AuthenticationTicket.Properties.AllowRefresh = true;
                            context.AuthenticationTicket.Properties.IsPersistent = true;
                            return Task.FromResult(0);
                        },
                        AuthenticationFailed = context =>
                        {
                            context.HandleResponse();
                            context.Response.Redirect("/Home/Error?message=" + context.Exception.Message);
                            return Task.FromResult(0);
                        },  
                    }

                });
        }
    }    
}

1 个答案:

答案 0 :(得分:3)

希望来自ASP.net或Owin团队的人能够以更好的方式参与其中,但以下是解决完全相同问题的方法。

为了使cookie身份验证优先并在cookie过期时返回401或重定向,您需要将cookie身份验证模式设置为active,将Open Id身份验证模式设置为passive。

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {
            AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
            SlidingExpiration = true,
            ExpireTimeSpan = TimeSpan.FromMinutes(15),
            CookieSecure = CookieSecureOption.Always,
            LoginPath = Microsoft.Owin.PathString.FromUriComponent("/Logout")
        });
        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Passive,
                PostLogoutRedirectUri = postLogoutRedirectUri,
            }
            );

在从活动状态变为被动状态后,我在请求授权资源时获得了401响应,但刷新页面只会使用从OpenID调用保存的令牌重新登录,该令牌在令牌过期时未过期。为了解决这个问题,我在注销控制器中设置了一个操作(在cookie选项上使用LoginPath指定),以便用户签署OpenID和Cookie

[Route("Logout")]
    public ActionResult Logout()
    {
        HttpContext.GetOwinContext().Authentication.SignOut(
            OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
        return View("~/Views/Index/Logout.cshtml");
    }

请注意,如果Open ID设置为passive并且cookie设置为active,则所有请求将被重定向为未授权的,如果它们不包含cookie(即使它们包含令牌)。开放ID请求必须专门调用Open ID处理程序进行授权并创建cookie

来源:

https://msdn.microsoft.com/en-us/library/microsoft.owin.security.cookies.cookieauthenticationoptions(v=vs.113).aspx

https://coding.abel.nu/2014/06/understanding-the-owin-external-authentication-pipeline/