2012-02-28 48 views
1

我有一个ASP.NET服务器设置作为身份验证类型的ASP.NET MVC站点。我还有一个带有Users表和Roles表的独立数据库(用户与一个或多个角色相关)。如果用户名同时位于用户表和CAS系统中,用户只能登录系统。我有这个解决方案的工作。自定义用户和角色与ASP.NET MVC3

我的问题是我现在需要某种形式的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,原理和IIdentity,但我很努力地看到我可以如何将它们应用到我目前的项目中。

+0

你看过[nerddinner](http://nerddinner.codeplex.com/)吗?他们实现CAS,并使用['FormsAuthenticationTicket'](http://msdn.microsoft.com/zh-cn/library/system.web.security.formsauthenticationticket.aspx)来存储标准成员资格提供者之外的详细信息。 – 2012-02-29 04:03:42

+0

@Brad感谢您的链接,有趣的是,自从我上次看到它以来,nerddinner有多大变化。不幸的是,我真的无法找到帮助我的代码的方法,因为一开始我的认证代码是完全不同的(我使用Jasig-CAS不知道这是否有所作为),还有,从我可以告诉,FormsAuthenticationTicket存储的唯一数据是用户名和失效时间(由于Jasig-CAS服务器不受我控制,我无法提供失效时间,我不确定到期时间是什么,它可以也从其他网站更新),而我需要存储一个类 – Manatherin 2012-02-29 07:13:22

回答

0

结束了一个自定义的授权属性,它使用CAS登录来检查用户是否存在于我的数据库中。它还检查该用户的角色。我还使用一个静态类来保存会话中的当前用户,并使用注销方法在用户注销时放弃会话。

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

最后,一旦你有登录的东西出来,你可以使用自己更复杂的权限系统,通过自定义的身份验证属性。我记得从一些其他的答案和文章中拼凑出来,但我目前似乎无法找到资料来源,如果我找到它们,我会尝试使用信用来源进行编辑。现在,我所能提供的就是这个要点,它提供了我使用的属性之一:https://gist.github.com/1959509

请记住,唯一真正相关的部分是覆盖OnAuthorization,它可以完成实际的工作。

相关问题