0

我需要区分一个按钮的注销,它有一个 SignOutAsync 方法调用和一个实际的会话过期。有没有办法我们可以做到这一点?

这就是我目前所拥有的:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                // Adds a cookie for the browser to remember
                .AddCookie(options =>
                {
                    options.LoginPath = "/signin";
                    options.LogoutPath = "/signout";
                    options.AccessDeniedPath = "/forbidden";
                    options.SlidingExpiration = true;
                });

签出方式

[HttpGet]
        public async Task<IActionResult> SignOut()
    {
        // Other code
        await httpContext.SignOutAsync();

        // Redirects him/her to the home route
        return Redirect((HttpContext.Request.Scheme +
                                            "://" +
                                            HttpContext.Request.Host +
                                            HttpContext.Request.Path.ToString() +
                                            HttpContext.Request.QueryString).Replace(HttpContext.Request.Path.ToString(), "/" + global.Portal.Name + "?so=1"));
    }

除其他外,这是我目前要尝试区分的内容:

if (_httpContext.User.Identity.IsAuthenticated)
                await this.UserIdentitySignOutAsync(_httpContext, _context);
            else if(_httpContext.Request.Path.Value.ToLower().Contains("/signin"))
                    Feedback = new Feedback() { Message = "Your session has expired.", IsValid = false };

当然,这是行不通的,因为有多个来源,我想根据登录结果显示不同的消息。但我需要知道的重要一点是,是否有任何方法可以区分两者。

我的意思是......因为此时 cookie 已经被清除,我们没有任何关于它发生了什么的信息。

如果这是一种区分这种差异的方法,请告诉我。我会很高兴地收到它。

谢谢你的帮助。

4

1 回答 1

0

我找到了答案。我必须添加一个事件 OnRedirectLogin 并设法通过设置会话字符串获取/设置其值来找到解决方法。

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                // Adds a cookie for the browser to remember
                .AddCookie(options =>
                {
                    options.LoginPath = "/signin";
                    options.LogoutPath = "/signout";
                    options.AccessDeniedPath = "/forbidden";
                    options.SlidingExpiration = true;
                    options.Events = new CookieAuthenticationEvents()
                    {
                        OnRedirectToLogin = op =>
                        {
                            if (op.Request.Query["so"].Count == 0)
                                op.HttpContext.Session.SetString("RedirectToLogin", true.ToString());
                        op.Response.Redirect(op.RedirectUri);

                        return Task.FromResult(0);
                    }
                };
            });

接着...

if (_httpContext.User.Identity.IsAuthenticated)
                await this.UserIdentitySignOutAsync(_httpContext, _context);
            else
            {
                var value = _httpContext.Session.GetString("RedirectToLogin");
                bool.TryParse(value, out bool redirectToLogin);

                if (redirectToLogin)
                {
                    Feedback = new Feedback() { Message = "Your session has expired.", IsValid = false };
                    _httpContext.Session.SetString("RedirectToLogin", false.ToString());
                }
            }

就这样...... :)

于 2020-02-25T16:43:22.690 回答