如果用户拥有以前有效的Cookie,如何删除对网站的访问权限?

时间:2016-01-29 13:40:31

标签: c# .net asp.net-mvc owin

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

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

更新

我相信OWIN Startup类中的以下代码需要更新以拦截/覆盖cookie authenticnticaiton。我要做的是检查用户是否有权访问该站点(如果该用户是无访问角色的一部分,则拒绝他们登录)。

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

2 个答案:

答案 0 :(得分:3)

这是我最终做的事情,它看起来像我认为它应该工作的方式。当读取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的回复确实帮我定制了我对这个主题的搜索,谢谢。

答案 1 :(得分:2)

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

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

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

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

Source