具有自定义角色的ASP.NET MVC和Windows身份验证

时间:2011-05-18 10:17:52

标签: asp.net asp.net-mvc windows-authentication

我正在尝试在ASP.NET MVC2应用程序中实现Windows身份验证。 我遵循了官方文档中建议的所有步骤:

<authentication mode="Windows" />

<authorization>
  <deny users="?" />
</authorization>

我已经指定了NTLM身份验证。到现在为止还挺好。一切正常。 我想检查登录我的数据库的用户。 我想从我的表中获取角色,然后使用自定义属性管理授权 我不想使用会员和角色提供商。 我已经有我的表用户/角色,因为他们已经被用于互联网应用程序(这是内联网应用程序)。

在我的互联网应用程序中,我有一个用户输入数据的表单。表单将发布到控制器,该控制器将检查所有内容并使用登录用户的用户(和角色)创建cookie。

在我的global.asax中,我已经捕获了AuthenticateRequest事件,在那里我读取了cookie并创建了一个自定义主体,我在整个应用程序中使用它来检查授权。

如何使用Windows身份验证实现此功能?

2 个答案:

答案 0 :(得分:23)

只需创建一个新主体并将其分配给Global.asax中的用户和线程(或使用操作过滤器)。

protected void Application_AuthenticateRequest(object sender, EventArgs args)
{
  if(HttpContext.Current != null)
  {
     String [] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name);

     GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);

     Thread.CurrentPrincipal = HttpContext.Current.User = principal;
  }
}

如果用户没有匹配的任何角色,可以使用web.config authoirzation元素禁止他们访问该应用:

<authorization>
  <allow roles="blah,whatever"/>
  <deny users="*"/>               
</authorization>

答案 1 :(得分:6)

只是为了补充上面的答案,希望这能节省一些时间。

我有VS 2015的Intranet MVC 5网站。

在使用HttpContext.Current.User更新顶​​行之前,代码对我不起作用。如果用户尚未在数据库中创建,则该站点为我提供了对HttpContext.Current.User的空引用。通过将.User添加到第一行,它在第一次加载时绕过了该代码并运行。

if (HttpContext.Current.User != null)
        {


            String[] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name);

            GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);

            Thread.CurrentPrincipal = HttpContext.Current.User = principal;
        }