如何使用 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 身份验证并注册自定义身份验证管理器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 自定义多重身份验证

使用自定义管理站点自动注册 Django 身份验证模型

如何在 sharepoint 2013 中自定义 Windows 身份验证弹出窗口?

如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证

Feathersjs - 如何创建自定义身份验证

windows 8 移动自定义身份验证