【问题标题】:Custom User and Roles with ASP.NET MVC3使用 ASP.NET MVC3 自定义用户和角色
【发布时间】:2012-03-18 12:01:54
【问题描述】:

我有一个 ASP.NET MVC 站点,其中一个 CAS 服务器设置为身份验证类型。我还有一个单独的数据库,其中包含一个用户表和一个角色表(用户与一个或多个角色相关)。只有当用户名同时在用户表和 CAS 系统中时,用户才能登录系统。我有这个解决方案工作。

我的问题是我现在需要在 User.IsAuthenticated 上使用某种形式的触发器,以便我可以跟踪当前用户(来自我的数据库),而我不可能尝试允许跟踪已注销的用户。我一直在想的是我需要将用户添加到 HttpContext 但如果 CAS 会话超时或用户注销,我不确定如何触发用户的清除。

我还希望有一些功能,例如 User.IsInRole(再次使用我的数据库,而不是 ASP.NET),但我不确定如何实现它。我想如果我可以成功地将用户添加到 HttpContext 中,那么 IsInRole 方法将只是一个 User.Roles.Contains(string role) 方法,但是如果我希望,例如,使用具有DataAnnotation [授权(角色=“ExampleRole”)]。

我查看了诸如How do I create a custom membership provider for ASP.NET MVC 2? 之类的问题,但这对我不起作用(可能与我使用 CAS 身份验证有关?)

任何指导或背景阅读将不胜感激,因为我真的不确定我应该从哪里开始。我已经阅读了 GenericPrinciple、IPrinciple 和 IIdentity,但我正在努力了解如何将它们应用到我当前的项目中。

【问题讨论】:

  • 你看过nerddinner吗?他们实现了 CAS,并使用 FormsAuthenticationTicket 在标准成员资格提供程序之外存储详细信息。
  • @Brad 感谢您的链接,有趣的是,自从我上次看到它以来,nerddinner 发生了多大的变化。不幸的是,我真的看不到那里的代码可以帮助我,首先我的身份验证代码完全不同(我正在使用 Jasig-CAS 不确定这是否会有所不同),而且,从我能告诉,FormsAuthenticationTicket 存储的唯一数据是用户名和到期时间(我无法提供到期时间,因为 Jasig-CAS 服务器不受我控制,我不确定到期时间是什么,它可以也从其他网站更新)而我需要存储一个类

标签: c# asp.net-mvc-3 authentication cas jasig


【解决方案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 的覆盖,它执行实际工作。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2015-07-21
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2012-02-17
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多