ADFS如何保持用户身份验证?

时间:2020-02-10 18:22:04

标签: asp.net-mvc authentication asp.net-core cookies adfs

我正在使用WsFed将ADFS SSO实施到应用中。如果我尝试运行[Authorize]方法,则会进入登录页面。登录时,将创建带有加密信息的cookie,并且我可以运行[Authorize]方法。 cookie具有选项ExpireTimeSpan = TimeSpan.FromSeconds(10);。到目前为止,这可以按预期工作,并且未经授权的用户无法访问该应用。

当cookie过期,被更改或从浏览器中删除时,混乱就开始了。发生这种情况时,如果我运行[Authorized]方法,我将自动再次登录,而无需重新输入我的凭据并重新创建cookie。但是,如果我使用return SignOut(...方法显式退出,则需要重新输入凭据。

如果删除Cookie,为什么ADFS重新验证我的身份,它怎么知道这样做?如果我明确退出,则不会这样做。保持身份验证不应该取决于存在正确值的Cookie吗?

Startup.ConfigureServices中的身份验证设置:

services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
    options.Wtrealm = Configuration["AppSettings:wsfed:realm"];
    options.MetadataAddress = Configuration["AppSettings:wsfed:metadata"];
    options.UseTokenLifetime = false;
})
.AddCookie(options =>
{
    options.Cookie.Name = "AuthenticationCookie";
    options.LoginPath = "/signin-wsfed";
    options.LogoutPath = "/NameController/Logout";
    options.ExpireTimeSpan = TimeSpan.FromSeconds(10);
    options.SlidingExpiration = true;
});

登录操作:

[AllowAnonymous]
[HttpGet]
public IActionResult Login()
{
    var authProperties = new AuthenticationProperties
    {
        RedirectUri = "https://app:1234/NameController/Index",
    };

    return Challenge(authProperties, WsFederationDefaults.AuthenticationScheme);
}

注销操作:

[AllowAnonymous]
[HttpGet]
public IActionResult SignOutOfADFS()
{
    return SignOut(
        new AuthenticationProperties
        {
            RedirectUri = "https://app:1234/NameController/AfterLogout"
        },
        CookieAuthenticationDefaults.AuthenticationScheme,
        WsFederationDefaults.AuthenticationScheme);
}

1 个答案:

答案 0 :(得分:1)

AD FS是一个身份提供程序,通常用于单点登录。其中的一个关键功能是AD FS确实会记住已登录的用户,以便为另一个网站进行身份验证。通过使用单独的会话来记住用户,而该会话使用AD FS网站的cookie持久保存。

从应用程序本地注销时,您要做的只是清除您的 local cookie。因此,当您尝试再次进行身份验证并且要求用户向身份提供者进行身份验证时,AD FS可以登录用户而无需再次询问他们的凭据。对于AD FS,您的应用程序就像是第三个网站,在用户已经登录到AD FS之后,它要求进行身份验证。

为了完全注销,您将必须执行WSFederation注销。作为该过程的一部分,将清除本地cookie,然后将用户重定向到AD FS签出页面,在该页面中还将清除AD FS身份验证cookie。在随后的身份验证尝试中,AD FS随后不再记住用户(因为没有cookie),因此他们必须使用其凭据再次进行身份验证。这就是您在SignOutOfADFS动作中正在做的事情。

WSFederation协议支持一种身份验证应用程序,该方法要求用户通过将wfresh=0参数与身份验证请求一起传递来要求用户与身份提供者重新进行身份验证。当前的AD FS版本也支持此功能。不幸的是,我认为ASP.NET Core的WSFederation身份验证处理程序当前不支持此参数。但这并不能真正阻止用户重新使用其身份验证,因此您将无法使用此安全功能。

相关问题