一个Api可以设置两个认证吗?身份服务器4

2024-06-24

我构建了一个身份服务器,并为客户端提供了两个 grant_types。混合和密码。

现在,他们每个人都可以独立获取访问令牌。 如果同时添加它们。只是混合工作。 密码模式可以获取访问令牌,但访问 api 时需要使用不记名令牌。我被重定向到混合登录页面。

 // add password authentication
 services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
         options.Authority = "http://localhost";
         options.RequireHttpsMetadata = false;

         options.Audience = "SlideCloudStorage";
     });
 // add hybrid authentication
 // todo add this information to configuration.
 services.AddAuthentication(
       options =>
       {
           options.DefaultScheme = "Cookies";
           options.DefaultChallengeScheme = "oidc";
       })
    .AddCookie("Cookies")
    .AddOpenIdConnect(
         "oidc",
         options =>
         {
             options.SignInScheme = "Cookies";
             options.Authority = "http://localhost";
             options.RequireHttpsMetadata = false;

             options.ClientId = "slide-cloud-storage";
             options.ClientSecret = "secret";
             options.ResponseType = "code id_token";

             options.SaveTokens = true;
             options.GetClaimsFromUserInfoEndpoint = true;

             options.Scope.Add("offline_access");
             options.ClaimActions.MapJsonKey("website", "website");
           });

希望这不是 XY 问题。 为什么我要添加两个身份验证?

密码模式适用于我的桌面客户端。 混合适用于我的网络/移动客户端。


services.AddAuthentication("Bearer")

这将默认身份验证方案设置为Bearer.

services.AddAuthentication(
    options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })

这将默认身份验证方案设置为Cookies(以及默认的挑战方案oidc)。所以此后,默认不再调用承载认证。

配置多个身份验证方案是完全可以的,并且在许多情况下也是必需的。但您必须明白,框架只能自动调用一个默认值(对于每个身份验证操作)。我已经解释过了对于这个问题更详细 https://stackoverflow.com/a/52493428/216074但这个想法基本上是,当你不做任何特殊的事情时,那么当请求进来时,将使用默认的身份验证方案来对用户进行身份验证。

所以在你的情况下,Cookies作为默认方案,用户将尝试通过其 cookie 登录。对于以用户为中心的应用程序来说,这通常是一个很好的默认设置,因为大多数用户将使用 cookie 来验证自己的身份。另一方面,对这些应用程序的 API 访问更加特殊,通常仅限于少数控制器或路由;因此,将承载身份验证作为默认值通常没有多大用处。

So when Cookies是默认的,而且只能有一个默认的,会自动调用,那么如何使用其他方案呢?答案是授权政策。

一般来说,授权策略允许您根据某些规则限制访问。策略基本上是这些规则的集合。出于授权目的,您通常会检查声明值以控制某人是否有权执行某些操作。然而,授权策略还有另一方面,那就是它们允许您指定认证方案作为规则。

当您使用以下方式创建授权策略时AuthorizationPolicyBuilder https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authorization.authorizationpolicybuilder?view=aspnetcore-2.2,您可以用它指定它需要的身份验证方案。当授权策略用于授权请求,它会自动认证这些方案(如果尚未经过身份验证)。

因此,您可以使用此机制来触发 API 控制器的承载身份验证,而不会影响默认的 cookie 身份验证,只要您不指定任何其他内容,就会使用默认的 cookie 身份验证。

[Authorize("ApiPolicy")]
public class MyApiController : ControllerBase
{
    // …
}

In Startup.ConfigureServices:

services.AddAuthorization(options =>
{
    var apiPolicy = new AuthorizationPolicyBuilder("Bearer")
        .RequireAuthenticatedUser()
        .Build();
    options.AddPolicy("ApiPolicy", apiPolicy);
});

这样,您就配置了一个自定义策略,您可以随时扩展该策略以添加其他要求(例如特殊声明),并且您可以使用该策略来授权客户端访问您的 API。

如果您只需要少数操作或控制器,您还可以直接在[Authorize]属性。这使您不必创建自定义授权策略,但另一方面,如果您想通过附加要求(或更改身份验证方案)扩展策略,当然需要更多的重复和维护:

[Authorize(AuthenticationSchemes = "Bearer")] 
public class MyApiController : ControllerBase
{
    // …
}

请注意,最后,这将also结果将临时创建一个策略来授权用户。所以效果和潜在机制确实是一样的。

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

一个Api可以设置两个认证吗?身份服务器4 的相关文章

  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 带方括号的 Uri.EscapeUriString

    这是一个奇怪的问题 但让我们看看它会得到什么样的回应 如果我编写一个控制台应用程序 VS 2013 NET 4 5 1 并执行这行代码 Uri EscapeUriString 我明白了 但是 如果我执行同样的事情 嗯 从技术上来说Uri E
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 如何在 WCF 中反序列化自定义 SOAP 标头?

    我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头 我发现这篇精彩的文章 http blogs msdn com b mohamedg archive 2012 10 21 adding custom soap headers
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • ASP.Net core Web API 将字符串编码为base64

    我是 Net Core 开发的新手 我有一个模型 public class CoreGoal Key public long CoreGoalId get set public string Title get set public str
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 具有可导出私钥的证书的“错误密钥”例外

    我正在尝试使用非对称加密来加密然后解密文件 我已经使用 makecert 创建了一个测试证书并将其安装到我的个人本地计算机存储中 将来我必须在多个服务器上安装此证书 这就是为什么我使用 pe 标志创建它 即使用可导出的私钥 证书已成功创建并
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • Netlify NodeJS 函数始终返回“对预检请求的响应未通过”

    我正在尝试使用创建一个 API 端点Netlify Lambda 函数 该代码在我的本地运行完美 但总是返回Access to XMLHttpRequest at https
  • ViewPager2 具有不同的项目高度和 WRAP_CONTENT

    有一些关于让 ViewPager 处理以扩展为中心的不同高度项目的帖子ViewPager自己修改它的onMeasure支持这一点 然而 鉴于ViewPager2被标记为最终类 扩展它不是我们可以做的事情 有谁知道是否有办法解决这个问题 例如
  • 如何在WCF请求和响应的soap标头中添加MessageID?

    企业移动设备管理协议在HTTP POST 请求中显示以下soap xml 如何将我的 Web 服务定义为要包含的肥皂头Action MessageID ReplyTo 和 To在请求和响应中 我尝试在 MessageCOntract 中定义
  • CSS 边框干扰绝对定位

    编辑 澄清 box sizing border box 似乎不适用 因为我使用的是绝对定位 下面的代码说明了我的问题 我使用绝对定位 因为我发现这对于基于流的布局来说更加棘手 但我愿意接受建议 我想要的是任意元素的边界 without影响节
  • platform.linux_distribution() 已弃用 - 有哪些替代方案?

    从 Python 3 5 开始platform linux distribution https docs python org 3 5 library platform html platform linux distribution已弃
  • 使用tensorflow和keras的不同训练结果

    Intro 我随机创建训练数据X形状为 1000 10 对于标签Y 它总是等于第一个元素X特征 例如 认为x1 0 1 0 2 0 3 0 9 theny 0 1 使用以下代码创建的数据集 from numpy random import
  • 是我的问题还是 Rails 和 Django 在 Windows 上安装困难?

    我尝试让这些框架在 Windows Vista 上运行几天 但没有成功 每次我认为我让它们工作时 我都会遇到一些涉及 PostgreSQL 或 MySQL 设置的随机错误 或者路径被搞砸了 或者一些其他命令行错误 未识别为内部或外部命令 或
  • 在 Java 中将希腊语转换为大写

    我想做的事情相当简单 String example Mary Had A Little Lamb String upper example toUpperCase 在希腊语中 只有大写单词的第一个字母才应包含重音字符 upper conta
  • 为什么 tkinter 输入验证需要调用 register() ?

    def check the input only allows digits only inp A function for validating the input the purpose of this is to let the us
  • 如何将产品添加到现有且已付款的 Woocommerce 订单中?

    我有一个 WooCommerce 网站 我的一位客户在该网站上购买了产品和电缆 该客户购买了一根与其他产品不兼容的电缆 并询问我们是否可以向他运送价格相同的兼容电缆 也许这是一个愚蠢的问题 但我如何编辑已付款的订单 删除不兼容的电缆并添加正
  • 将 NSDate 转换为 NSString

    我如何转换 NSDate to NSString所以只有这一年 yyyy 格式是输出到字符串吗 怎么样 NSDateFormatter formatter NSDateFormatter alloc init formatter setDa
  • 如何在 Swift 中使用 AXObserverAddNotification?

    如何在 Swift 中使用 AXObserverAddNotification 来检测 UI 更改 Obj C 中有一个很好的答案 我的应用程序如何检测另一个应用程序窗口的更改 https stackoverflow com questio
  • 如何使用 Route53 从一个顶级域重定向到另一个顶级域

    如果我的术语在这里不太正确 请道歉 我的域 albunack net 在 Route53 上运行良好 我还在 Route 53 控制下拥有域 albunack com 我希望对 albunack com 的任何请求都重定向到 albunac
  • 引用初始化和直接绑定与间接绑定

    考虑以下情况 struct A operator int int x A 规范说在http eel is c draft dcl init ref 5 http eel is c draft dcl init ref 5关于引用绑定是直接还
  • 版本控制 rpm 规范文件

    我正在配置一台构建机器来为大量非常相似的项目生成 rpm 每个项目的规范文件在名称上以及有时在依赖项和其他属性上都略有不同 每个项目都有自己的 git 存储库 其中包含项目文件 这些规范文件仅存在并且实际上仅对构建系统本身有用 每个项目都可
  • 调试目标调用异常

    我正在使用 Visual Studio 2008 C Express Edition 并且正在尝试调试由于我触发的事件而发生的 TargetInitationException 我的问题并不是专门针对此异常 因此我没有包含有关此异常的任何详
  • 当只有一个对象时将XML转换为Json数组Java

    我有一个 XML 我需要将其转换为 JSON 当在 XML 中我们有多个元素时 它会创建正确的 jsonArray 但是当单个元素未创建数组时 任何人都可以帮助我如何在单个元素的情况下获取数组 String TEST XML STRING
  • 取消选中复选框后,输入类型文本字段会重复

    我有名为名字 姓氏和电子邮件的复选框 我必须在单击复选框后显示输入类型 或者如果未选中 则删除该复选框 另外 我试图获取选中的复选框的标签 但我没有得到它 你愿意帮我吗 document ready function add text ty
  • 为什么人们在代码中使用魔法值而不是 null ?

    我在遗留代码和一些 NET 开源项目中看到了这一点 我无法想象这样做的理由 对我来说 仅使用 null 似乎更容易 Example public class Category int parentID bool HasParent get
  • 一个Api可以设置两个认证吗?身份服务器4

    我构建了一个身份服务器 并为客户端提供了两个 grant types 混合和密码 现在 他们每个人都可以独立获取访问令牌 如果同时添加它们 只是混合工作 密码模式可以获取访问令牌 但访问 api 时需要使用不记名令牌 我被重定向到混合登录页