我们有一个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);
},
}
});
}
}
}
答案 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://coding.abel.nu/2014/06/understanding-the-owin-external-authentication-pipeline/