【问题标题】:How does ADFS keep a user authenticated?ADFS 如何让用户保持身份验证?
【发布时间】:2020-02-10 18:22:04
【问题描述】:

我正在使用 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);
}

【问题讨论】:

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


    【解决方案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 身份验证处理程序当前不支持此参数。但这并不会真正阻止用户重复使用他们的身份验证,因此您将无法使用此安全功能。

    【讨论】:

    • 非常感谢您的回复。那么,当我删除由.AddCookie() 创建的AuthenticationCookie 时,我会再次自动进行身份验证,因为 AD FS 网站的 cookie 仍然包含我的信息?如果我使用SignOutOfADFS 注销,AuthenticationCookie 和 AD FS 网站上的 cookie 都会被删除,然后我才能完全注销?
    • 是的,没错。当您删除应用程序上的 cookie 时,应用程序会触发登录并重定向到 ADFS,然后 ADFS 仍会识别您并将您重新登录,而无需您输入凭据。
    • 您是否知道 AD FS 还能识别我多久?我怎么能修改那个时间?
    • 我认为您可以使用 PowerShell cmdlet Set-AdfsProperties -SsoLifetime 进行配置。您当然还可以找到一些关于“ADFS 令牌生命周期”的文档,例如AD FS Single Sign-On Settings
    猜你喜欢
    • 2014-08-17
    • 2016-05-11
    • 2012-11-08
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多