用户可以访问.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?
}
}
});
}
}
答案 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);
}