2011-05-18 132 views
15

我想在我的ASP.NET MVC2应用程序中实现Windows身份验证。 我已经按照由官方文档建议的所有步骤:ASP.NET MVC和Windows身份验证与自定义角色

<authentication mode="Windows" /> 

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

我指定NTLM身份验证。到现在为止还挺好。一切正常。 我想检查用户登录我的数据库。 我想从我的表中获取角色,然后使用自定义属性管理授权。
我不想使用成员资格和角色提供者。 我已经拥有我的表用户/角色就位导致他们已经用于Internet应用程序(这是Intranet应用程序)。

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

在我的Global.asax我被困在AuthenticateRequest事件,我读的cookie和创造,我用遍应用程序检查授权自定义主体。

我该如何使用Windows身份验证来实现这一点?

回答

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> 
+0

@Xhalent:是的,但是...哪里...? – LeftyX 2011-05-18 10:41:18

+0

我希望我已经澄清了它 – Xhalent 2011-05-18 11:14:30

+0

@Xhalent:感谢您的帮助。现在看起来很清楚。如果用户未被授权访问整个应用程序(它不在数据库中),你会怎么做? – LeftyX 2011-05-18 11:19:48

6

只需添加到上面的回答,希望这节省了一些时间。

我有一个内联网MVC 5个网站与VS 2015

,直到顶线与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; 
     } 
相关问题