从所有会话中注销IdentityServer4

时间:2019-03-14 17:23:04

标签: asp.net-core asp.net-identity identityserver4

我有一个IdentityServer4实例来管理身份验证,我发现我的小型实现似乎无法正确处理以下几件事:

1)X分钟后没有任何交互,“自动注销”,然后具有Authorized属性的新操作将返回401。

2)多个浏览器会话(我只是在这里复制选项卡)似乎彼此独立,因此当我从一个屏幕注销时,我仍然可以在另一个选项卡上进行操作,但是我希望我的API会拒绝自用户确实退出后的任何请求。

由于我使用MongoDB作为持久层,因此我选择集成软件包https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore。我的AccountController看起来像这样:

/// <summary>
/// Show login page
/// </summary>
[HttpGet]
public IActionResult Login(string returnUrl)
{
    var viewModel = new LoginInputModel
    {
        ReturnUrl = returnUrl
    };

    return View(viewModel);
}

/// <summary>
/// Handle postback from username/password login
/// </summary>
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginInputModel model)
{
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberLogin, false);

        if (result.Succeeded)
        {
            if (Url.IsLocalUrl(model.ReturnUrl))
            {
                return Redirect(model.ReturnUrl);
            }

            return Redirect("~/");
        }

        ModelState.AddModelError(string.Empty, AccountOptions.InvalidCredentialsErrorMessage);
    }

    // something went wrong, show form with error
    return View(model);
}

/// <summary>
/// Show logout page
/// </summary>
[HttpGet]
public async Task<IActionResult> Logout(string logoutId)
{
    var logoutContext = await _interaction.GetLogoutContextAsync(logoutId);

    await _signInManager.SignOutAsync();

    return Redirect(logoutContext.PostLogoutRedirectUri);
}

我的问题是,如何使SignInManager以某种方式执行登录以建立登录持续时间,如下所示:

https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/master/Quickstart/Account/AccountController.cs#L125

因为似乎关闭了浏览器后,它仍然没有退出。不知道为什么令牌没有过期,也不确定我是否需要做其他事情来验证它/过期。

这个问题的第二个方面是,如果可能的话,我该如何注销所有浏览器标签/实例中的该会话。

在我的StartUp.cs中,我具有以下配置: var Authority = Configuration.GetSection(“ IdentityServer:Authority”)。Value;

        Logger.Info($"Using authority {authority} for authentication...");

        var identityDatabaseName = Configuration.GetSection("IdentityServer:DatabaseName").Value;

        Logger.Info($"Using {identityDatabaseName} MongoDB database for identity server data...");

        services.AddIdentity<ApplicationUser, MongoIdentityRole>()
                .AddMongoDbStores<ApplicationUser, MongoIdentityRole, Guid>(connectionString, identityDatabaseName)
                .AddDefaultTokenProviders();

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            options.Authority = authority;
            options.Audience = "myapi";
            options.RequireHttpsMetadata = false;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

谢谢!

0 个答案:

没有答案