存储在数据库中的MVC 4应用程序,Windows身份验证和自定义角色

时间:2017-03-02 16:01:16

标签: c# asp.net-mvc windows asp.net-mvc-4 authentication

大家早上好,

我对MVC 4应用程序有以下要求。

  1. 使用Windows凭据进行身份验证(自动)。
  2. 根据在一组数据库表中定义的角色,对应用程序中经过身份验证的特定页面/视图/控制器进行限制。
  3. 修改

    这是我到目前为止所尝试的内容:

    1. 将我的MVC应用程序设置为使用Windows身份验证
    2. 将其放入我的Global.asax文件

      if(HttpContext.Current.User!= null) { string [] roles = {" testmyrole" }; GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity,roles); Thread.CurrentPrincipal = HttpContext.Current.User = principal; bool test = User.IsInRole(" testmyrole"); }

    3. 但是HttpContext.Current.User始终为null ...

      最终将通过调用数据库来填充字符串[]角色......硬编码目前仅用于测试。

      我可以将上述代码放在我的MVC应用程序中的任何想法,以便无论调用哪个View,此代码都会运行,因此我可以填充角色,然后在我的其他控制器中使用以下代码

      [Authorize(Roles ="testmyrole")]
      public ActionResult Index()
      {
      ... do other fun stuff here
      }
      

      感谢您的时间。

      科里

1 个答案:

答案 0 :(得分:0)

我想我可能找到了解决问题的方法。

所以这就是我所做的:

  1. 修改了我的viewStart.CSHTML文件,如下所示:
  2. @using SMTRApp.Business;

    @using System.Security.Principal;

    @using System.Threading;

    @{ 
        Layout = "~/Views/Shared/_Layout.cshtml";
        string[] roles = BusinessLayer.BLGetUserRoles(User.Identity.Name).ToArray();
        GenericPrincipal principal = new GenericPrincipal(User.Identity, roles);
        Thread.CurrentPrincipal = System.Web.HttpContext.Current.User = principal;
    }
    

    然后,我能够将以下代码放在我的控制器的开头,以实现基于SQL角色的安全性:

    [Authorize(Roles = "Accounting, Analyst, ETL")]
    

    无论如何调用视图,是否有更好的方法来实现基于角色的安全性?

    任何想法都会非常感激。

    科里