身份服务器4不删除cookie

时间:2018-11-28 15:08:08

标签: c# .net-core identityserver4

我使用身份服务器在Angle 5上安装了前端应用程序,在C#上使用了后端api。 问题是,当我单击注销按钮时,令牌被删除并且我被重定向到注销页面。

但是当我尝试刷新主页时,我被重定向到microsoftonline.com 自动进行身份验证并重定向回主页 我在此处缺少提供用户名和密码,而这种情况以chrome隐身方式出现。

我注意到的是,如果我从microsoftonline.com手动删除cookie, 并重复该过程,这次将要求我输入用户名和密码。

所以首先我试图用这种方式清理所有cookie,但这无济于事

foreach (var key in HttpContext.Request.Cookies.Keys)
{
    HttpContext.Response.Cookies.Append(key, "", new CookieOptions() { Expires = DateTime.Now.AddDays(-1) });
}

bellow是我的accountcontroller注销方法和cookie屏幕

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutViewModel model)
{
    var idp = User?.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;
    var subjectId = HttpContext.User.Identity.GetSubjectId();

    if (idp != null && idp != IdentityServerConstants.LocalIdentityProvider)
    {
        if (model.LogoutId == null)
        {
            model.LogoutId = await interaction.CreateLogoutContextAsync();
        }

        try
        {
            await signInManager.SignOutAsync();
        }
        catch (NotSupportedException)
        {
        }
    }

    // set this so UI rendering sees an anonymous user
    HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity());

    // get context information (client name, post logout redirect URI and iframe for federated signout)
    var logout = await interaction.GetLogoutContextAsync(model.LogoutId);

    var vm = new LoggedOutViewModel
    {
        PostLogoutRedirectUri = logout?.PostLogoutRedirectUri,
        ClientName = logout?.ClientId,
        SignOutIframeUrl = logout?.SignOutIFrameUrl
    };

    await persistedGrantService.RemoveAllGrantsAsync(subjectId, "angular2client");

    return View("LoggedOut", vm);
}

enter image description here

2 个答案:

答案 0 :(得分:1)

请尝试使用Identity Server提供的扩展方法(例如here)从HttpContext本身清除cookie。

或尝试以下操作:

params = {'batch_size':  TrainConfig.BATCH_SIZE,
              'dim' : ( TrainConfig.BATCH_SIZE, 1, TrainConfig.SAMPLES),
              'labels_dim': ( TrainConfig.BATCH_SIZE,),
              'n_classes' : TrainConfig.OUTPUT_DIM}

training_generator = DataGenerator(train_set, **params)
validation_generator = DataGenerator(val_set, **params)

training_steps_per_epoch = int(1.*len(train_set) / batch_size)
validation_steps_per_epoch = int(1.*len(val_set) / batch_size)

history = model.fit_generator(generator=training_generator,
                              verbose=1,
                              use_multiprocessing=False,
                              workers=1,
                              steps_per_epoch=training_steps_per_epoch,
                              epochs=epochs,
                              validation_data=validation_generator,
                              validation_steps =validation_steps_per_epoch,
                              callbacks=callbacks)

您的注销控制器方法中。

第三个选项(我在一个测试MVC客户端中拥有的选项):

await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);

在将客户端注册为 public ActionResult Logout() { Request.GetOwinContext().Authentication.SignOut(); return Redirect("/"); } public void SignoutCleanup(string sid) { var cp = (ClaimsPrincipal)User; var sidClaim = cp.FindFirst("sid"); if (sidClaim != null && sidClaim.Value == sid) { Request.GetOwinContext().Authentication.SignOut("Cookies"); } } (或{{})时,在单击按钮时调用Logout方法的地方,SignoutCleanup是传递给Identity Server的方法。 1}},或两者都取决于您的情况。

PS :现在,总的来说,我认为您的方法是不正确的,但是我不知道您的全部情况,因此,我不会对您进行评判-只是给出建议和建议。

对于前端客户端(Angular,Vue,vanilla JS等),建议使用客户端oidc-client-js库。 here是用法示例。就像我说的-这只是一个建议,但是如果您刚开始进行身份验证设置,则建议您看看。

答案 1 :(得分:1)

如果我理解正确,那么您是通过IdentityServer4服务与Microsoft联合的吗?如果是这样,那么当您退出身份服务时,还应该为用户提供退出外部提供程序的选项(如果它支持相关功能-需要在发现文档中定义end_session_endpoint) 。

标准OIDC中间件支持此功能,因此您应该能够通过调用SignoutAsync()并传递MS联合登录的方案名称来启动退出。

另一种选择是始终在外部登录请求中发送prompt=login,然后检查您退回的auth_time声明。这样一来,您就可以始终强制进行交互式登录,并可以验证何时发生交互式登录。