如何使用 Windows 身份验证并注册自定义身份验证管理器
Posted
技术标签:
【中文标题】如何使用 Windows 身份验证并注册自定义身份验证管理器【英文标题】:How to use windows authentication and register custom auth manager 【发布时间】:2011-08-01 17:55:38 【问题描述】:我正在努力保护 RESTFul 服务。
所有客户端都是windows内网客户端,我想使用windows集成认证。作为初始实现,我想对最终用户的凭据执行授权检查,并允许用户访问服务上的“读取”方法,并将服务上的写入方法访问权限授予服务帐户。在使任何这些工作时,我遇到了许多不同的问题。我在各个地方阅读了大量的文章,但到目前为止没有一个占上风。 以下是应用程序的 web.config 中的配置。
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="Windows" />
<identity impersonate="true" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<protocolMapping>
<add scheme="http" binding="webHttpBinding" />
</protocolMapping>
<services>
<service name ="SecureREST" behaviorConfiguration="RESTAuthorisationBehaviour">
<endpoint address="" binding="webHttpBinding" bindingConfiguration="default" contract="Service.ISecureService">
</endpoint>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="default">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="RESTAuthorisationBehaviour">
<serviceAuthorization serviceAuthorizationManagerType="Security.RESTAuthorisationManager"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
在 IIS 中,我禁用了匿名身份验证。我需要这样做,因为我们希望所有客户端都经过身份验证,以便我们可以执行授权检查。我还启用了 Windows 身份验证(NTLM?)。
我遇到的第一个问题是,当我从浏览器测试时,我收到以下错误消息:
此服务的安全设置需要“匿名”身份验证,但托管此服务的 IIS 应用程序未启用。
我不想启用匿名身份验证,因此在其他地方似乎有一些配置指示匿名身份验证,这显然与我已禁用它的事实不一致。我还需要在哪里指定不允许匿名身份验证? (您还会看到我没有使用任何 mex 端点,根据各种文章,这可能是导致此问题的原因)。
我遇到的下一个问题是我正在尝试注册自定义授权管理器。这样做的原因是我想检查用户是哪些组的成员,并据此做出授权决定。例如,如果用户是名为“ReadOnly”的组的成员,那么他们只能调用服务上的 get 方法。如果客户端是“ReadAndWrite”组的成员,那么他们也可以在服务上调用 put 方法。
你应该看到我已经尝试注册一个授权类(派生自 ServiceauthorisationManager);这在 RESTAuthorisationBehaviour 行为中表达。我已经在这个类中加入了一些日志,但是这些都没有显示在日志中,所以我知道它没有正确注册。
最后一个问题是模拟。为了对此进行测试,在服务代码中,我正在访问 WindowIdentity 并将其显示在日志中。我发现用户名不代表我需要的最终用户,因此我可以执行前面描述的授权检查。相反,我看到的是用户是应用程序池标识('IIS APPPOOL\SecureREST')。这对我没有用。我已经打开了模拟标志(正如您从配置中看到的那样),但是我如何让它工作以便真正的客户端凭据在 WindowsIdentity 对象中表示?我用来获取 Windows 身份的代码如下:
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string accountName = windowsIdentity.Name;
我也尝试在 windowsIndentity 对象上调用 Impersonate 方法,但无济于事。
那么我该如何冒充经过身份验证的用户呢?
【问题讨论】:
【参考方案1】:关于匿名身份验证的异常,请尝试在您的服务行为中禁用 http 获取元数据,如下所示:
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
</behavior>
【讨论】:
以上是关于如何使用 Windows 身份验证并注册自定义身份验证管理器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 sharepoint 2013 中自定义 Windows 身份验证弹出窗口?