Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 从所有会话注销IdentityServer 4_Asp.net Core_Asp.net Identity_Identityserver4 - Fatal编程技术网

Asp.net core 从所有会话注销IdentityServer 4

Asp.net core 从所有会话注销IdentityServer 4,asp.net-core,asp.net-identity,identityserver4,Asp.net Core,Asp.net Identity,Identityserver4,我有一个管理身份验证的IdentityServer4实例,我发现我的小实现似乎无法正确处理以下几件事情: 1) 在X分钟无交互的情况下“自动注销”,则具有Authorized属性的新操作将返回401返回 2) 多个浏览器会话(我在这里只是复制选项卡)似乎彼此独立,因此当我从一个屏幕注销时,我仍然可以在另一个选项卡上执行操作,但我希望我的API会拒绝任何请求,因为用户确实注销了 由于我使用MongoDB作为我的持久层,所以我选择集成这个包。我的AccountController如下所示: ///

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

1) 在X分钟无交互的情况下“自动注销”,则具有
Authorized
属性的新操作将返回401返回

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

由于我使用
MongoDB
作为我的持久层,所以我选择集成这个包。我的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);
}
//
///显示登录页面
/// 
[HttpGet]
公共IActionResult登录(字符串返回URL)
{
var viewModel=新的LoginInputModel
{
ReturnUrl=ReturnUrl
};
返回视图(viewModel);
}
/// 
///处理从用户名/密码登录的回发
/// 
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务登录(LoginInputModel)
{
if(ModelState.IsValid)
{
var result=wait _signInManager.PasswordSignInAsync(model.Username,model.Password,model.RememberLogin,false);
if(result.successed)
{
if(Url.IsLocalUrl(model.ReturnUrl))
{
返回重定向(model.ReturnUrl);
}
返回重定向(“~/”);
}
ModelState.AddModelError(string.Empty,AccountOptions.InvalidCredentialsErrorMessage);
}
//出了问题,用错误显示表单
返回视图(模型);
}
/// 
///显示注销页面
/// 
[HttpGet]
公共异步任务注销(字符串logoutId)
{
var logoutContext=await_interaction.GetLogoutContextAsync(logoutId);
等待_signInManager.SignOutAsync();
返回重定向(logoutContext.PostLogoutRedirectUri);
}
我的问题是,如何让SignInManager以某种方式执行登录,从而建立如下登录持续时间:

/// <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);
}

因为它似乎在关闭浏览器后也不会注销。不确定令牌为何未过期,以及我是否必须执行其他操作来验证它/使其过期

这个问题的第二个方面是,如果可能的话,我如何在所有浏览器选项卡/实例中进行一次注销以使该会话无效

在my StartUp.cs中,我有以下配置: var authority=Configuration.GetSection(“IdentityServer:authority”).Value

Logger.Info($“使用权限{authority}进行身份验证…”);
var identityDatabaseName=Configuration.GetSection(“IdentityServer:DatabaseName”).Value;
Info($“使用{identityDatabaseName}MongoDB数据库获取identity server数据…”);
服务.额外性()
.AddMongoDbStores(connectionString,identityDatabaseName)
.AddDefaultTokenProviders();
services.AddAuthentication(选项=>
{
options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(选项=>
{
选项。权限=权限;
options.acquisition=“myapi”;
options.RequireHttpsMetadata=false;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
谢谢