【发布时间】:2016-10-26 02:44:43
【问题描述】:
我有一个小项目,使用 Visual Studio 2013、.NET 4.5、MVC 5 和 EF 6 构建。我使用 Windows 身份验证创建它,但现在我需要检查 Active Directory 组中的成员资格以允许或拒绝访问。
我已经陷入了许多非常深的兔子洞,试图找出如何做到这一点。起初我认为我需要更改项目以使用“本地”身份验证。但是,我发现:
- 在 VS 2013 中显然无法更改项目使用的身份验证类型(除了手动编辑某些文件)。
- 目前还没有任何文档解释如何设置“本地”身份验证。 (真的吗?怎么可能?)
- 无论如何,我需要的根本不是“本地”身份验证,因为这仅适用于 Windows 身份联合服务(或类似的服务)。我应该使用的只是带有 ASP.Net 角色的 Windows 身份验证,Windows 显然是在我登录时从 Active Directory 组中获取的。
所以,假设 #3 是真的,我尝试阅读大量关于此的帖子,但它们似乎分为两个基本组:
- 直截了当、简单的方法,我无法开始工作,可能是因为它假定了一些我没有的知识。
- 复杂的自定义编码方法,我怀疑这些方法是通过代码完成的,而这可能在无代码方法中可以完成。
假设 #1 是要走的路,这是我最近的尝试。
在我的控制器中,我有:
[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 服务器以对我进行身份验证) .
我错过了什么吗?还是我假设无需编写自定义代码就可以完成此操作是错误的?
警告:我来自 Java 世界,对 .NET、MVC 等还很陌生,所以请使用小词。 :-)
【问题讨论】:
-
你应该看看这个问题。这可能是针对早期版本的 mvc,但 Windows 身份验证已经有一段时间没有改变了。 stackoverflow.com/questions/13767439/…
-
我之前看过那篇文章,并基于我尝试过的大部分内容,但它不起作用。然而,我现在才发现我做错了什么。在我的控制器的属性中,我在域名称和角色名称之间有 2 个反斜杠,而不是一个。所以我有:
[Authorize(Roles=@"SomeDomain\\SomeGroup")]而不是[Authorize(Roles=@"SomeDomain\SomeGroup")]Doh!
标签: c# asp.net asp.net-mvc authentication asp.net-mvc-5