使用用户/密码将基本身份验证添加到 web.config 的最简单方法

Posted

技术标签:

【中文标题】使用用户/密码将基本身份验证添加到 web.config 的最简单方法【英文标题】:Simplest way to add Basic authentication to web.config with user/pass 【发布时间】:2015-11-28 19:05:24 【问题描述】:

我正在使用 ASP.NET WebApi 2 应用程序设置 Azure API 管理。 API Management 建议在 API Management 代理和 ASP.NET WebApi 之间设置 Basic auth,以确保 WebApi 只能通过 API Management 代理访问。

(当然 OAuth 令牌仍会与“真实”身份验证请求一起发送,但我稍后会添加。)

考虑到这一点,我真的不想在应用程序中实现基本身份验证,我希望通过 Web.config 由 IIS 专门处理它。

问题如何设置我的 Web.config 以使用 Web.config 中存储的用户名/密码进行基本身份验证?

我的尝试

我尝试关注这篇文章Apply ASP.NET Authentication and Authorization Rules to Static Content with IIS 7.0's Integrated Pipeline Feature,但运气不佳。

这个问题没有答案,但他们可能要求类似的东西:web.config single user basic auth

我在这里找到的其他答案包括在应用程序中添加我不想做的身份验证。

这是我的 Web.config:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <appSettings configSource="bin\debug-appSettings.config"/>
  <connectionStrings configSource="bin\debug-connectionStrings.config"/>
  <system.web>
    <compilation targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
    <authentication mode="Forms">
      <forms>
        <credentials passwordFormat="Clear">
          <user name="test" password="test" />
        </credentials>
      </forms>
    </authentication>
    <authorization>
      <allow users="test" />
      <deny users="*" />
    </authorization>
  </system.web>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
      <remove name="OPTIONSVerbHandler"/>
      <remove name="TRACEVerbHandler"/>
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
    <modules>
      <remove name="FormsAuthenticationModule" />
      <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
      <remove name="UrlAuthorization" />
      <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
    </modules>
    <security>
      <authentication>
        <basicAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Azure.AppService.ApiApps.Service" publicKeyToken="31BF3856AD364E35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-0.9.64.0" newVersion="0.9.64.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="MiniProfiler" publicKeyToken="b44f9351044011a3" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.2.0.157" newVersion="3.2.0.157"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-4.0.20622.1351" newVersion="4.0.20622.1351"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-6.1.0.0" newVersion="6.1.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
</configuration>

我向 PostMan 发送了一个带有以下标头的请求:

Authorization: Basic dGVzdDp0ZXN0
Content-Type: application/json

但我得到的只是 IIS 的 401.1 页面。

我错过了什么?

【问题讨论】:

Forms Auth 和 Basic Auth 是两个不同的东西。如果您使用 IIS 进行基本身份验证,则需要使用用户名和密码创建一个 windows 帐户。您将需要对您的 API 使用 https。您还可以使用 Azure API 应用程序并将 API 设为私有。 希望此视频对您有所帮助:channel9.msdn.com/Blogs/AzureApiMgmt/Last-mile-Security Basic Authentication 是一个定义术语,浏览器将弹出一个本机框,询问用户名和密码,并且将针对 Windows 用户帐户测试给定的凭据Windows 服务器。此行为在tools.ietf.org/html/rfc7617 中指定。您要问的是基本身份验证 【参考方案1】:

我最终将 BasicAuthentication 实现为 HttpModule。稍后我将使用详细信息更新此答案。

编辑:

NuGet 包:https://www.nuget.org/packages/Hexasoft.BasicAuthentication

来源:https://github.com/hexasoftuk/Hexasoft.BasicAuthentication

【讨论】:

如何在我的 IIS 服务器上安装它以供所有网站使用?有一个 Nuget 命令安装在它执行的位置吗?如何将它与 Powershell 一起使用以将其安装到 IIS 中? 希望不需要更改 IIS。这就是重点。

以上是关于使用用户/密码将基本身份验证添加到 web.config 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 JWT 身份验证添加到硬编码的前端用户名和密码身份验证中?

如何为 Firebase (Kotlin) 创建自定义身份验证

当我们有一个身份验证系统时,如何为某些链接添加基本身份验证

没有用户名和密码的邮递员基本身份验证

使用 AWS 和 S3 存储桶对静态站点进行基本用户身份验证

它是不是需要在任何具有基本身份验证的请求中传递用户名:密码组合?