禁用 WebAPI 的 Windows 身份验证

2024-01-12

我正在使用 MVC4 应用程序并使用 WebAPI 来获取/发送我的所有数据。在控制器中,我使用 HttpClient 请求来获取数据,一切正常。我面临的问题是,当在项目中启用 Windows 身份验证时,Web API 调用将返回 401 未经授权的错误。

我的控制器中执行调用的代码是:

using (var client = new HttpClient())
{
    var invoiceDetailUrl = BASE_URL + Url.HttpRouteUrl(
        "DefaultApi",
        new { controller = "InvoiceDetails", id = id }
     );

     var result = client.GetAsync(invoiceDetailUrl).Result; 

 }

站点必须启用 Windows 身份验证,但 Web API 控制器不一定要启用。我尝试在 web.config 中排除 API 控制器,如下所示:

<location path="api">
        <system.web>
            <authorization>
                <allow users="*"/>
        </authorization>
    </system.web>
</location>

但 web.config 中的添加没有任何作用。

有什么建议么?


验证

Web API 假设身份验证发生在主机中。 IIS 使用 HTTP 模块进行身份验证。 asp.net 现在允许您通过 web.config 配置 IIS 或 ASP.NET 中内置的任何身份验证模块,或者编写您自己的 HTTP 模块来执行自定义身份验证。

您可以同时使用多个身份验证,这不是问题。 在你的情况下,你需要Windows 身份验证和匿名身份验证。 Windows 身份验证将secure您的网站,匿名身份验证将open您的 Web API。

在 IIS 中配置身份验证

托管在 IIS Express 上打开“属性”窗格(通过 F4,而不是项目的属性),然后应用所需的身份验证 将“匿名身份验证”设置为“禁用”。 将“Windows 身份验证”设置为“启用”。

托管在 IIS 7 或更高版本上在 IIS 管理器中,打开功能视图中的身份验证功能。启用/禁用所需的身份验证。如果身份验证系统不是一个选项(例如 Windows),您需要通过服务器管理器(添加角色服务)安装它。

授权

ASP.NET授权

在 ASP.NET 中,有两种方法来授权对给定资源的访问:文件授权和 Url 授权。我不会在这里解释,但你可以阅读这个article http://msdn.microsoft.com/en-us/library/wce3kxhd%28v=vs.100%29.aspx.

重要的是您可以在 web.config 中允许/拒绝用户和/或组。

Windows 身份验证中的默认配置是仅允许身份验证用户 *****,如下所示:

<authorization>
<deny users="?" ></deny>
</authorization>

如果您想允许匿名用户?在 url 位置“api”下,添加以下内容:

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

网页API授权

asp.net Web Api 授权发生在管道的后期,更靠近控制器。这使您可以在授予资源访问权限时做出更精细的选择。

Web API提供内置的授权过滤器,授权属性 http://msdn.microsoft.com/en-us/library/system.web.http.authorizeattribute.aspx。还有一个允许匿名属性 http://msdn.microsoft.com/en-us/library/system.web.http.allowanonymousattribute.aspx。 您可以在全局、控制器或操作上使用它。 默认情况下,所有操作都是授权的.

测试API

通过浏览器

集成 Windows 身份验证适用于任何支持协商身份验证方案的浏览器。它是 Internet Explorer 和现在的 Chrome 的 cas:当使用 Windows 身份验证浏览网站时,它们将自动提供 Windows 凭据。 Firefox不支持这种方案,所以我经常用这个浏览器测试身份验证。

通过 HttpClient调用 Web Api(如浏览器)时,您的 HttpClient 需要提供凭据。这是通过配置具有适当凭据的 HttpClientHandler 来完成的。

//use default credentials aka Windows Credentials
HttpClientHandler handler = new HttpClientHandler()
{
    UseDefaultCredentials = true
};

//use username/password credentials
HttpClient client = new HttpClient(handler);

var handler = new HttpClientHandler {
    Credentials = new NetworkCredential(username, password)
};

var httpClient = new HttpClient(handler);

希望对你有帮助。

在你的例子中最后一件重要的事情是你的 Web Api根本不允许匿名用户!因为你正在使用默认凭证在您的 HttpClientHandler 中,这意味着您的服务需要 Windows 身份验证。您不必在开放和公共服务中配置任何凭据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

禁用 WebAPI 的 Windows 身份验证 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • SOAP 错误:正在解析 WSDL:无法从 加载

    在 PHP 中 我收到错误 SOAP 错误 正在解析 WSDL 无法从 加载http xxx xxxx asmx WSDL http xxx xxxx asmx WSDL 无法加载外部实体 http xxx xxxx asmx WSDL h
  • 绕过合并提交的预提交挂钩

    我设置了一些 git hook 来运行一些gulp预提交命令 我基本上是跑步jshint plato 我基本上想在两种情况下绕过这些 修补程序分支 主 修补程序 git merge 或者找到一种在合并提交情况下不会崩溃的方法 plato g
  • 自定义numpy的向量化运算的效率问题

    我有一个 python 函数 如下所示 def myfun x if x gt 0 return 0 else return np exp x where np is the numpy图书馆 我想在 numpy 中对函数进行向量化 所以我
  • Python HTML 编码 \xc2\xa0

    我已经为此苦苦挣扎了一段时间 我正在尝试将字符串写入 HTML 但是在清理它们后 格式出现问题 这是一个例子 paragraphs Grocery giant and household name Woolworths is battere
  • 如何创建不可选择的上下文菜单项?

    我有一个简单的上下文菜单 我想添加一个标题项到它 它无法被选择 甚至不能用鼠标光标突出显示 当我设定Enabled false 我仍然可以标记它 但感觉很愚蠢 因为它显然已被禁用并且文本是灰色的 Example 像这样 我无法标记或选择 菜
  • 从 FirebaseListAdapter 中的 onItemClick 检索 Firebase 密钥

    我有一个 Firebase DB 我正在使用push 方法将条目添加到数据库中 从而生成随机密钥作为每个条目的参考 在应用程序的一部分中 我使用 FirebaseListAdapter 将一些数据库条目填充到列表视图中 然后我正在实施set
  • 将嵌套组分配给 Azure AD 应用程序中的角色 用户和组

    我在 Azure AD 应用程序清单中配置了一些角色类型 当我将组 X 分配给角色时 我可以看到 X 中的用户已分配 现在假设组 Y 是 X 内部的组 Y 中的用户未分配 为什么 有没有办法让所有 内部 用户也被分配 Thanks 今天不行
  • 我如何强制 MediaWiki 尊重单行中断?

    默认情况下 MediaWiki 会忽略单个换行符 将它们视为单个空格 要在页面中插入新行 必须在源代码中插入两个连续的换行符 这会产生一个新段落 p 也可以插入 br 直接进入源码 如何修改 MediaWiki 解析引擎 以便源代码中的单行
  • Hibernate:集合的集合

    这是我一直遇到的一个问题 我想让 hibernate 管理一个代表集合集合的表 例如 地图中的地图 套装清单 列表地图 例如 我希望能够表示这一点 class OwningClass Long entityId Map
  • 如何正确使用matchedGeometry?

    当我使用匹配的几何视图修改器时 我总是收到警告 Multiple inserted views in matched geometry group Pair
  • 获取文件夹的树形结构

    我的数据库中的 文件夹 表中有以下文件夹 Folder1 Folder2 Folder3 Folder4 文件夹的路径 Folder1 Folder2 Folder3 Folder4 当我单击Folder3时 我必须获取路径为 Folder
  • 使用通用 List 线程安全吗

    我有一个System Collections Generic List
  • 两个张量的双点积

    我有两个张量 A是二阶张量并且B是四阶张量 我知道当计算双点积 http en wikipedia org wiki Dyadics Product of dyadic and dyadic两个张量的结果张量的秩将减少两倍 因此在我的示例中
  • 我如何知道 .NET Standard 需要哪些平台扩展?

    我跑了 NET 可移植性分析器 https marketplace visualstudio com items itemName ConnieYau NETPortabilityAnalyzer针对我想从我自己的 NET Standard
  • 将徽章添加到选项卡

    如何向选项卡添加徽章 我正在使用这个代码 protected void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView
  • 如何更改作为参数传递的变量的值?

    如何更改 C 中作为参数传递的变量的值 我试过这个 void foo char foo int baa if baa foo ab else foo cb 并致电 char x baa foo x 1 printf s n x 但它打印ba
  • 如何在 Netbeans 平台上获取项目类型?

    有没有办法知道所选项目的类型 我想根据项目类型 如 J2SE 项目 执行一些特定操作 以下是我发现的唯一方法 public final class MyAction extends CookieAction Override public
  • 如何从 JavaScript 中的 foreach 循环中删除特定数组元素

    var fruit apple pear pear pear banana 如何从该数组中删除所有 梨 水果 我尝试了以下方法 但仍然留下一个梨 for var f in fruit if fruit f pear fruit splice
  • 动态添加边缘 visjs

    谁能帮我在这个 visjs 网络中动态添加边 实际上 我正在尝试使用拖放将节点添加到画布 但是当我单击节点并将边缘动态添加到画布上现有的另一个节点时 我需要帮助添加边缘 您可以使用 vis js 的 更新 函数动态添加节点或边 您只需传入一
  • 禁用 WebAPI 的 Windows 身份验证

    我正在使用 MVC4 应用程序并使用 WebAPI 来获取 发送我的所有数据 在控制器中 我使用 HttpClient 请求来获取数据 一切正常 我面临的问题是 当在项目中启用 Windows 身份验证时 Web API 调用将返回 401