当用户拥有以前有效的 cookie 时,如何删除对网站的访问权限

本文关键字:删除 权限 访问权 访问 网站 何删除 拥有 用户 有效 cookie | 更新日期: 2023-09-27 18:32:30

用户有权访问经过.net MVC OWIN身份验证的网站,并有一个cookie登录他们。然后,管理员撤销访问权限并将其角色重置为"无访问权限"角色。

网站如何检测到这一点?是否可以更新 Cookie 身份验证代码以在登录时仅检查数据库中用户的角色?如果是这样,有人可以指出我覆盖此功能的正确方向吗?

更新:

我相信 OWIN 启动类中的以下代码是需要更新以拦截/覆盖 cookie 身份验证的内容。我正在尝试做的是检查用户是否有权访问该站点(如果用户是无访问权限角色的一部分,请拒绝他们登录)。

public partial class Startup
{
    public void ConfigureAuthentication(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = context =>
                {
                    //Somehow check the users role here?
                }
            }
        });
    }
}

当用户拥有以前有效的 cookie 时,如何删除对网站的访问权限

这是我最终所做的,它似乎以我认为它应该工作的方式工作。当读取OWIN cookie时,我检查用户数据库(我意识到这是多余的),以确保他们的访问权限没有被撤销。如果它已被撤销,我拒绝cookie身份验证,它们将被发送回站点登录屏幕。

public partial class Startup
{
    public void ConfigureAuthentication(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Login"),
            Provider = new CookieAuthenticationProvider()
            {
                OnValidateIdentity = context =>
                {
                    string userName = context.Identity.Name;
                    User user = userRepository.Users.SingleOrDefault(u => u.UserName == userName);
                    if(user.Roles.SingleOrDefault(r => r.Name == "No Access") != null)
                    {
                        context.RejectIdentity();
                    }
                    return System.Threading.Tasks.Task.FromResult(0);
                }
            }
        });
    }
}

从我的测试来看,这似乎有效。我认为可能有一个更好、更少冗余的解决方案,但我还没有遇到过。我相信这段代码在每次页面加载时都会运行,这让我有点担心。我可能会稍后发布另一个问题,询问是否有更好的方法来做到这一点,但就目前而言,这是有效的。

Mark C的回复确实帮助我调整了对这个主题的搜索,谢谢。

最简单的解决方案是"删除"用户的cookie,以便将其注销。然后,当他们再次登录时,他们将拥有新的权限。

我说"删除",是因为您实际上并没有删除cookie,而是使其无效 - 通常通过设置过去的日期。

MSDN 中的此代码会将 Cookie 的到期日期设置为过去的一天:

if (Request.Cookies["UserSettings"] != null)
{
    HttpCookie myCookie = new HttpCookie("UserSettings");
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    Response.Cookies.Add(myCookie);
}