.NET WebApi 身份验证

2023-11-23

目前,我有一个销售小部件的 MVC Web 应用程序。用户使用表单身份验证登录我们的系统,然后可以根据他们所属的组执行各种功能(即下订单、查看订单、取消订单等)。

我们的任务是编写一个 API,让第三方能够在我们的系统中创建和查看订单。每个第三方都有自己的用户名,并且根据其所属的组,将仅限于某些 API 方法。

我们正在考虑使用 Web Api 作为提供 API 的机制。我们还希望能够从 MVC Web 应用程序使用此 api。不幸的是,我们遇到了 Web Api 身份验证问题。使用 DelegatingHandler,我们为 WebApi 实现了基于 SSL 的基本身份验证。这对我们的第三方来说非常有用。但是,当尝试从 MVC 应用程序使用 Api 时,我们收到 401 访问被拒绝错误,因为用户在 MVC 应用程序中使用表单身份验证进行了身份验证,但我们无法将这些凭据传递到 Web Api。有没有办法将 Forms Auth 凭据从我们的 MVC 应用程序传递到我们的 Web api 应用程序?

IIS 设置 名为 WidgetStore 的网站,带有两个 Web 应用程序

  • WidgetStore\UI - 使用表单身份验证
  • WidgetStore\Api - 使用基本身份验证

有没有办法将 Forms Auth 凭据从我们的 MVC 应用程序传递到我们的 Web api 应用程序?

当然,我们以以下调用 Web API 的 MVC 控制器操作为例:

[Authorize]
public ActionResult CallWebApi()
{
    var baseAddress = new Uri("https://example.com");
    var cookieContainer = new CookieContainer();
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
    {
        var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName].Value;
        cookieContainer.Add(baseAddress, new Cookie(FormsAuthentication.FormsCookieName, authCookie));
        var result = client.GetAsync("/api/values").Result;
        result.EnsureSuccessStatusCode();

        // now you can read the result.Content ...
    }
}

这假设您还在 Web API 项目的 web.config 中启用了表单身份验证,并且 cookie 名称与 MVC 项目中使用的名称相同。

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

.NET WebApi 身份验证 的相关文章

随机推荐

  • 这些字符串在 Python 解释器内部是如何表示的?我不明白

    coding utf 8 a print type a
  • 如何跨网络互斥?

    我有一个在网络上运行的桌面应用程序 每个实例都连接到同一个数据库 那么 在这种情况下 如何实现在连接到同一数据库的所有正在运行的实例上工作的互斥体 换句话说 我不希望两个以上实例同时运行相同的函数 如果一个实例已经在运行该函数 则其他实例不
  • Node.js 命名空间

    努力充分利用 Node 的 module require exports 设置来进行正确的 OO 编程 创建全局命名空间而不使用导出 如在客户端 js 应用程序开发中 是一种好的做法吗 因此 在模块 Namespace Constructo
  • 如何在 C# Winforms 中保存 app.config 中的配置

    有人可以给我一个如何在 app config 中保存键 值的示例吗C 和WinForms In ASP NET Configuration config WebConfigurationManager OpenWebConfiguratio
  • 将 Angular 应用程序添加到现有项目

    我有一个现有项目 我想在其中使用 Angular CLI 添加 Angular 应用程序 项目结构现在看起来像这样 节点模块 src client server shared angular cli json 包 json 客户端和共享文件
  • Python计数器:打印计数为x的键

    说我有一个Counter代表单词集合的对象 gt gt gt words hello hello hello world gt gt gt counter Counter words 找出哪些单词计数为 1 的一种方法是迭代counter
  • Java 中有 OLE 自动化吗?

    是否可以在 Java 中使用 OLE 自动化 如果不能 为什么在 Java 中不能呢 我正在寻求以不同格式 即 csv 等 自动导出 Excel 电子表格 感谢您提前的回答 最近 2013 年 3 月 一位独立贡献者向 JNA 添加了对通用
  • 在哪里可以找到有关 Perl 特殊变量的信息?

    Perl 有很多特殊变量 例如 F 等等 所有 Perl 的特殊变量都记录在哪里 Perl 使用的所有特殊变量都记录在佩尔多克 佩尔瓦尔 您可以访问随您的产品一起提供的本文档版本perl通过输入perldoc perlvar在命令行上
  • jQuery 选择器 - 其中项目没有特定类别的子项

    我想选择属于 nav 直接子项的列表项 它们本身没有具有 活动 类的直接子项 我认为应该是这样 但它不起作用 nav gt li not gt a active 您可以这样做 nav gt li not has a active
  • Ada 中的自定义“图像属性”?

    所以我有一件事 type Thing is new record elements end record 我有一个将其字符串化的函数 function ToString t Thing returns string 我希望能够告诉 Ada
  • 在现有映射对象中添加或覆盖 aes

    这是最小的情况 df lt data frame x 1 5 y 1 col 1 5 mapping lt aes x x y y ggplot df mapping geom point size 10 现在我想在现有的基础上添加 或覆盖
  • Linux 中的优雅关闭服务器套接字

    我希望能够停止侦听 Linux 中的服务器套接字 并确保从客户端角度打开的所有连接都得到正确处理并且不会突然关闭 即 接收 ECONNRESET ie sock create socket listen sock non zero back
  • 使用 jquery contains 更改 div 中文本的颜色

    这里 div 内的整个文本都变成红色 但我只需要改变 bar 字的颜色
  • 在 WooCommerce 中以编程方式创建可变产品和两个新属性

    我想以编程方式创建一个具有两个新变量属性的变量产品 父 产品 所有这些属性都来自 WordPress 插件 因此没有对 API 的 HTTP 请求 这两个变量属性也应该动态创建 如何才能做到这一点 使用 WooCommerce 版本 3 更
  • 如何获取SceneKit中子节点旋转后的真实位置?

    我正在使用 SceneKit 开发一个场景 我有一个带有子节点的主节点 Main node SCNNode planet SCNNode node planet geometry SCNSphere sphereWithRadius 2 p
  • C# 中如何检查两个字符串是否部分匹配? [复制]

    这个问题在这里已经有答案了 可能的重复 是否有为 C 编写的模糊搜索或字符串相似性函数库 我正在创建一个应用程序 它将排除用户输入的歌曲或艺术家或专辑名称 然后将查找字符串数组或数组列表以查找任何可能的匹配项 自动建议将根据匹配百分比计算
  • iOS 如何在没有堆栈跟踪的情况下调试崩溃,例如: [__NSArrayM objectAtIndex:]: 索引 0 超出空数组的范围?

    我试图关闭模态视图控制器并收到以下错误 由于未捕获的异常 NSRangeException 而终止应用程序 原因 NSArrayM objectAtIndex 索引 0 超出空数组的范围 有一次我花了 4 个小时尝试调试这样的错误 谁能告诉
  • JVM 如何知道运行时在哪里捕获异常?

    据我了解 throw是一个原始的 jvm 命令 当调用它时 JVM 检查当前调用堆栈是否可以捕获它 如果不能 那么 java 只是弹出调用堆栈 几乎就像调用 return 一样 然后jvm 检查当前调用堆栈是否可以捕获它 递归地依此类推 我
  • os.exec* 的第一个参数

    来自 python 文档 各种 exec 函数采用 新程序的参数列表 加载到进程中 在每种情况下 这些参数中的第一个被传递 将新程序作为自己的名称 而不是作为用户可能的参数 已在命令行中输入 为了 C程序员 这是argv 0 传递给程序的
  • .NET WebApi 身份验证

    目前 我有一个销售小部件的 MVC Web 应用程序 用户使用表单身份验证登录我们的系统 然后可以根据他们所属的组执行各种功能 即下订单 查看订单 取消订单等 我们的任务是编写一个 API 让第三方能够在我们的系统中创建和查看订单 每个第三