将 Azure-AD 与 dotnet core 2 web-api 中的本地用户数据库结合起来

2024-04-25

我正在创建一个 .net-core2 web-api,它允许 Azure-AD 中的用户使用它。该 API 是多租户的,因此来自多个 Azure-AD 的用户应该能够授权。

但是,也可以为没有企业 Azure-AD 帐户的用户创建帐户。这些用户存储在数据库中(本地用户)。

因为它是一个 web-api,所以我实现了一个自定义令牌提供程序,以便本地用户可以获得令牌来使用受保护的 web-api。

但是,我无法向 web-api 添加两个单独的“承载”身份验证:

services.AddAuthentication(options =>
{
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddAzureAdBearer(options => Configuration.Bind("AzureAd", options))
.AddJwtBearer(options => new JwtBearerOptions {
     TokenValidationParameters = tokenValidationParameters  
 });

这会引发错误:

System.InvalidOperationException:方案已存在:承载者

我完全理解。但是我如何并行实现这两种身份验证机制呢?


您必须指定不同的标识符。目前两者都使用“Bearer”标识符。

例如,您可以通过以下方式为 JWT Bearer 指定不同的 JWT Bearer:

.AddJwtBearer("CustomJwt", options => { });

这解决了标识符冲突的问题,但为了并行支持两种身份验证方案,您将需要进行额外的修改。

David Fowler 提出了 2.0 中的一种方法:https://github.com/aspnet/Security/issues/1469 https://github.com/aspnet/Security/issues/1469

app.UseAuthentication();

app.Use(async (context, next) =>
{
    // Write some code that determines the scheme based on the incoming request
    var scheme = GetSchemeForRequest(context);
    var result = await context.AuthenticateAsync(scheme);
    if (result.Succeeded)
    {
        context.User = result.Principal;
    }
    await next();
});

在您的情况下,如果您点击中间件时上下文中没有用户,您可以使用所有 Bearer (Azure AD) 方案。

在 ASP.NET Core 2.1 中,我们将获得“虚拟身份验证方案”,它以更一流的方式允许这种情况:https://github.com/aspnet/Security/pull/1550 https://github.com/aspnet/Security/pull/1550

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

将 Azure-AD 与 dotnet core 2 web-api 中的本地用户数据库结合起来 的相关文章

随机推荐

  • 为什么 Logstash 需要这么长时间才能启动/加载?

    Edit 我更改了标题 因为问题不是我最初想象的那样 事实是 logstash 需要超过一分钟开始 这可能会被误解为 沉默 我正在尝试让logstash运行 所以我按照官方网站上的说明进行独立安装 http logstash net doc
  • 为什么 NSURLSession uploadTaskWithRequest:fromData: 无法上传到 php 服务器?

    php 代码工作正常 我已经从同一服务器上的 html 表单上传了文件 上传的文件大小从 40K 到 2 0M 不等 因此其大小不高 在运行 PHP 5 3 的服务器上激活文件上传 我发现了很多这样的帖子 还没有答案 https stack
  • 绑定到 ViewModel 和 CodeBehind 中的属性

    我确信这是一个可笑的无知问题 但无论如何我还是要问这个问题 因为我搜索了又搜索 要么不理解我所看到的解决方案 要么没有找到我所寻求的答案 我有一个 MVVM 应用程序 我的 XAML 设置为 VM 的 DataContext 其中屏幕上的数
  • 将表部署到表存储中的最佳方法

    你能让我知道吗 进行表存储部署的最佳方法是什么 因为我的开发团队询问他们有很多表 每个表都有数千个条目 因此 他们要求我咨询任何微软团队或博客人们检查进行表存储部署的最佳方法 您知道我们该怎么做吗 因为脚本每次都会耗尽和插入数千个条目 我们
  • Windows 7 上的 VirtualBox 端口转发不起作用

    Windows 7 上的 VirtualBox 端口转发不起作用 我尝试通过端口转发从我的 Windows 7 主机 ssh 到我的 VirtualBox 但 VirtualBox 不会打开端口进行侦听 我可以通过打开 VirtualBox
  • 如何在 Cocoa 中检查文件是否被锁定?

    有没有API可以检查文件是否被锁定 我在中找不到任何 APINSFileManagerclass 让我知道是否有任何API可以检查文件的锁定 我发现以下与文件锁定相关的链接 http lists apple com archives coc
  • 使用 MVC 和 DAO 模式在 JSP 页面中的 HTML 中显示 JDBC 结果集

    我正在使用 JSP 和 JDBC 实现 MVC 我已将数据库类文件导入到 JSP 文件中 并且想显示数据库表的数据 我不知道该如何归还ResultSet从 Java 类到 JSP 页面并将其嵌入到 HTML 中 我怎样才能实现这个目标 在设
  • 从命令行安装 Oracle 客户端,无需用户交互

    我正在寻找一种在 Windows 上安装 Oracle 客户端但从命令行运行的方法 为了自动运行它应有没有用户交互 对于 Oracle Universal Installer 的命令行选项 Oracle 文档非常稀疏 即使运行设置为setu
  • Golang 结构继承没有按预期工作?

    查看这个沙箱 https play golang org p elIHgHAZjT 声明从不同结构继承的结构时 type Base struct a string b string type Something struct Base c
  • 可以在没有 dynamoDB 的情况下使用 AWS App-Sync

    我对 Amazon app sync 的离线和同步功能感兴趣 但我想知道它是否可以在没有 dynamoDB 作为后端的情况下使用 用 VTL 为 dynamoDB 编写的 graphQL 解析器看起来很糟糕 看来使用 mongo 后端会好得
  • 是否可以在越狱的ios上使用外部键盘模拟触摸事件?

    是否可以在 iOS 越狱以及越狱涉及的所有元素上模拟特定屏幕坐标中的触摸事件 按下物理外部键盘 通过相机连接套件或蓝牙的 USB 上的特定按键 我会用它来用脚按下应用程序 振幅 中的按钮 我想使用键盘作为脚踏开关 仅供私人使用 没有应用商店
  • 如何使用 OData 在单个 POST 请求中正确创建和链接一对一关系

    在 OData Operations 文档的第 2 4 节第四段中 它写道 在使用 POST 创建实体时 也可以在同一请求中创建链接 但是 我在尝试完成这项工作时遇到了麻烦 在创建时就多对多链接提出了类似的问题 看起来如果没有批量请求 就不
  • 将 CVC 传递给 stripe.createPaymentMethod JS?

    我需要 CVC 和 Expiry 的单独输入 因此我创建了 3 个 Stripe 元素 let elements stripe elements let cardNumber elements create cardNumber cardN
  • 如何使用窗口函数优化SQL查询

    这个问题与this https stackoverflow com questions 32222889 how to calculate power consumption from power records 一 我有一个包含设备功率值
  • 在 LG WebOS 电视上启用开发者模式

    我正在 LG webOS 智能电视上开发一个简单的应用程序 由于我没能从 USB 驱动器运行我的应用程序 因此我尝试使用 Eclipse IDE 中的开发人员模式 事情是 我添加了一个新的目标配置 指向物理电视 IP 当我尝试连接时 需要密
  • 独特的柱组合

    这是我的简化数据集 foo lt data frame var1 c 1 10 var2 rep 1 5 2 var3 rep 1 2 5 var4 rep 3 7 2 总共 20 个变量 foo var1 var2 var3 var4 v
  • Saml 无 Cookie 保留状态 ASP.NET CORE

    var certbase env IsDevelopment AppDomain CurrentDomain BaseDirectory var pathpfx Path Combine certbase xxxxx pfx var pat
  • 在 Hudson 通知的电子邮件中提供最新测试结果信息

    我有一个项目 有很多测试失败 所以如果我能通过电子邮件收到最新版本的失败测试数量比较 那就太好了 我需要的只是测试结果链接显示在项目页面中的信息 最新测试结果 10 次失败 2 这可能吗 我已经尝试过 email ext 插件 但它并没有告
  • 允许对对象重新排序的算法,同时只需要更新恒定数量的对象位置

    我有一大堆对象 我希望根据它们的一个属性来保持顺序 作为一个例子 我们假设一个对象可能看起来像 var myObject id c 1 position 0 有序集合的简单实现如下所示 id c 1 position 0 id c 2 po
  • 将 Azure-AD 与 dotnet core 2 web-api 中的本地用户数据库结合起来

    我正在创建一个 net core2 web api 它允许 Azure AD 中的用户使用它 该 API 是多租户的 因此来自多个 Azure AD 的用户应该能够授权 但是 也可以为没有企业 Azure AD 帐户的用户创建帐户 这些用户