我有一个ASP.NET MVC站点,其中CAS服务器设置为身份验证类型。我还有一个单独的数据库,其中包含Users表和Roles表(用户与一个或多个角色相关)。如果Username同时位于User表和CAS系统上,则用户只能登录系统。我有这个解决方案工作。
我的问题是我现在需要在User.IsAuthenticated上使用某种形式的触发器,以便我可以跟踪当前用户(来自我的数据库),而不是我试图允许跟踪已注销的用户的可能性。我一直在想的是我需要将用户添加到HttpContext但我不确定如果CAS会话超时或用户注销时如何触发用户清除。
我也希望有一些功能,如User.IsInRole(再次使用我的数据库,而不是ASP.NET),但我不知道如何实现这一点。我想如果我可以成功地将用户添加到HttpContext,那么IsInRole方法将只是一个User.Roles.Contains(字符串角色)方法,但是如果我希望如何使用,例如,如何使用方法DataAnnotation [Authorize(role =“ExampleRole”)]。
我查看了How do I create a custom membership provider for ASP.NET MVC 2?等问题,但这对我不起作用(可能与我使用CAS身份验证有关吗?)
任何指导或背景阅读都会受到赞赏,因为我真的不确定我应该从哪里开始。我已经阅读了GenericPrinciple,IPrinciple和IIdentity,但我很难看到如何将它们应用到我当前的项目中。
答案 0 :(得分:0)
使用自定义授权属性,使用CAS登录来检查用户是否存在于我的数据库中。它还会检查该用户的角色。我还使用了一个静态类来保存会话中的当前用户,并使用logout方法在用户注销时放弃会话。
答案 1 :(得分:-1)
我有两个人为你服务。此链接非常好地解释了如何使用您自己的对象替换HttpContext用户:http://bradygaster.com/custom-authentication-with-mvc-3.0
他的方法使用MVC过滤器,但您也可以在Global.asax文件中捕获Authentication事件。使用具有您自己实现的表单系统可能很简单或不依赖于您正在做的事情,但它归结为在您自己的逻辑中调用FormsAuthentication.SetAuthCookie和.SignOut。
public static void FormsLogin(this User user, bool persist)
{
FormsAuthentication.SetAuthCookie(user.DisplayName, persist);
user.AddHistory("Login event.", HistoryType.Login, "SYSTEM");
Users.OnUserLogin(user);
SetLastActivity(user);
}
public static void FormsLogout(this User user)
{
FormsAuthentication.SignOut();
}
最后,一旦您完成了登录工作,您就可以通过制作自定义的Auth属性来使用您自己的更复杂的权限系统。我记得从其他一些答案和文章中拼凑出来,但我现在似乎无法找到消息来源,如果我找到它们,我会尝试编辑信用来源。现在,我能提供的就是这个要点,它提供了我使用的一个属性:https://gist.github.com/1959509
请记住唯一真正相关的部分是OnAuthorization的覆盖,它可以完成实际工作。