C# 使用Active Directory组进行Windows身份验证
我有一个小项目,使用Visual Studio 2013、.NET 4.5、MVC 5和EF 6构建。我使用Windows身份验证创建了它,但现在我需要检查Active Directory组中的成员身份,以允许或拒绝访问 我已经下了很多很深的兔子洞,试图找出如何做到这一点。起初,我假设需要将项目更改为使用“内部部署”身份验证。然而,我发现:C# 使用Active Directory组进行Windows身份验证,c#,asp.net,asp.net-mvc,authentication,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Authentication,Asp.net Mvc 5,我有一个小项目,使用Visual Studio 2013、.NET 4.5、MVC 5和EF 6构建。我使用Windows身份验证创建了它,但现在我需要检查Active Directory组中的成员身份,以允许或拒绝访问 我已经下了很多很深的兔子洞,试图找出如何做到这一点。起初,我假设需要将项目更改为使用“内部部署”身份验证。然而,我发现: 在VS 2013中,显然没有办法更改项目使用的身份验证类型(手动编辑某些文件除外) 目前还没有任何文档说明如何设置“本地”身份验证。(真的吗?这怎么可能?)
[Authorize(Roles=@"SomeDomain\\SomeGroup")]
public class SomeController : Controller
在我的Web.config文件中,我有:
<system.web>
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
<providers>
<clear/>
<add name="AspNetWindowsTokenRoleProvider"
type="System.Web.Security.WindowsTokenRoleProvider"
applicationName="/" />
</providers>
</roleManager>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="BehaviorConfiguration">
<serviceAuthorization
principalPermissionMode="UseAspNetRoles"
roleProviderName="AspNetWindowsTokenRoleProvider" />
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
当我尝试访问该页面时,系统会提示我登录。输入登录ID和密码后,我将继续收到登录提示。我不允许进入页面
我没有任何地方告诉我的应用程序Active Directory服务器在哪里,但我得到的印象是Windows已经知道了这一点(因为,当我登录到Windows时,它会访问Active Directory服务器来验证我的身份)
我错过什么了吗?或者我错误地认为这可以在不编写自定义代码的情况下完成
注意:我是.NET、MVC等的新手,来自Java世界,所以请使用小词::-) 我发现了问题。我上面所说的是正确的,只是我在域名和角色名之间有两个反斜杠,而不是一个。修复程序只是将其更改为:
[Authorize(Roles=@"SomeDomain\SomeGroup")]
您还可以在App_Start文件夹的RegisterGlobalFilters中将此设置为筛选器
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
if (filters == null)
{
throw new ArgumentNullException("filters");
}
filters.Add(new HandleErrorAttribute());
var authorizeAttribute = new AuthorizeAttribute
{
Roles = "Domain\Group" // Role = group in Active Directory
};
filters.Add(authorizeAttribute);
}
}
你应该检查一下这个问题。这可能是mvc的早期版本,但Windows身份验证在一段时间内没有改变。我早些时候看过那篇文章,大部分是基于我在上面的尝试,但它不起作用。然而,我现在才明白我做错了什么。在控制器中的属性中,域名称和角色名称之间有两个反斜杠,而不是一个。所以我有:
[Authorize(Roles=@“SomeDomain\\SomeGroup”)]
而不是[Authorize(Roles=@“SomeDomain\SomeGroup”)]
Doh!NET学习者的解释性说明:将@
放在任何字符串文字之前意味着“将此字符串完全按照所写内容进行处理,而不将反斜杠符号作为控制代码的转义符号赋予任何特殊权力”。另一种方法是将@
放在字符串之前,然后将反斜杠加倍,因为每个\\都将被解释为单个文字\。这是为了允许使用C样式的控制代码,例如\r\n\t
等。不过,对于解决您自己的问题来说,这已经做得很好了!