Identity Server 4 上授权客户端的自定义端点

2024-04-29

我希望我的 Identity Server 4 服务器提供附加服务(例如,"MyAdditionalService")对于一些注册客户。他们将通过在服务器上定义的自定义端点来使用该服务。

我正在考虑为我的该服务定义一个 API(例如,名为“myAdditionalService”),以便可以根据客户端的配置向客户端授予对此类服务的访问权限。但是,我不确定如何限制对端点(MVC - 操作方法)的访问,仅允许允许使用 API 的客户端(可能代表用户)。

我发现我可以这样做:

services.AddAuthorization(options =>
     {
       options.AddPolicy("MyAdditionalServicePolicy",
           policy => policy.RequireClaim("scope", 
           "myAdditionalService"));
      });

并使用属性[Authorize("MyAdditionalServicePolicy")]装饰用于访问此类服务的操作方法。但是,我不知道服务器是否可以同时作为API,甚至不知道是否可能。

我怎样才能实现这个?令人困惑的是,令牌服务也扮演着 API 的角色,因为它保护对操作方法或端点的访问。

Thanks.


UPDATE:

我的网络应用程序是一个 IdentityServerWithAspNetIdentity ,它已经使用了 Asp.net core Identity 的身份验证机制。举个例子,如果向某些注册客户提供的附加服务,我的 Web 应用程序是用户的 Twitter 好友列表(在名为 Twitter 的控制器上建模,名为 ImportFriends 的操作),因此 api 称为“TwitterFriends”

根据下面回复的建议,我修改了我的Configure()方法有app.UseJwtBearerAuthentication()。我已经有了app.UseIdentity() and app.UseIdentityServer()如下所示:

        app.UseIdentity();
        app.UseIdentityServer();


        app.UseJwtBearerAuthentication(new JwtBearerOptions
        {
            AuthenticationScheme = "Bearer",
            Authority = Configuration["BaseUrl"],
            Audience = "TwitterFriends",
            RequireHttpsMetadata = false                 //TODO: make true, it is false for development only
        });

        // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
        app.UseGoogleAuthentication(new GoogleOptions
        {
            AuthenticationScheme = "Google",
            SignInScheme = "Identity.External", // this is the name of the cookie middleware registered by UseIdentity()

在专用控制器上:

 [Authorize(ActiveAuthenticationSchemes = "Identity.Application,Bearer")]
//[Authorize(ActiveAuthenticationSchemes = "Identity.Application")]
//[Authorize(ActiveAuthenticationSchemes = "Bearer")]
[SecurityHeaders]
public class TwitterController : Controller
{...

但我在日志中得到了这个:

info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware
[7]
      Identity.Application was not authenticated. Failure message: Unprotect tic
ket failed
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed for user: (null).
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.A
uthorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
      Executing ChallengeResult with authentication schemes (Identity.Applicatio
n, Bearer).
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware
[12]
      AuthenticationScheme: Identity.Application was challenged.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[12]
      AuthenticationScheme: Bearer was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action IdentityServerWithAspNetIdentity.Controllers.TwitterContro
ller.ImportFriends (IdentityServerWithAspNetIdentity) in 86.255ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 105.2844ms 401

我尝试了该属性的不同组合,但似乎 Identity.Application 和 Bearer 在这种情况下无法相处:收到 401。

任何帮助表示赞赏。 谢谢..


请参阅此示例,了解如何在与 IdentityServer 相同的 Web 应用程序中托管 API。

https://github.com/brockallen/IdentityServerAndApi https://github.com/brockallen/IdentityServerAndApi

本质上,您需要添加 JWT 令牌验证处理程序:

services.AddAuthentication() .AddJwtBearer(jwt => { jwt.Authority = "base_address_of_identityserver"; jwt.Audience = "name of api"; });

在 API 本身上,您必须选择 JWT 身份验证方案:

public class TestController : ControllerBase { [Route("test")] [Authorize(AuthenticationSchemes = "Bearer")] public IActionResult Get() { var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToArray(); return Ok(new { message = "Hello API", claims }); } }

如果您想强制执行额外的授权策略,您可以将其传递到 [Authorize] 属性中或强制调用它。

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

Identity Server 4 上授权客户端的自定义端点 的相关文章

随机推荐

  • C 预处理器字符串化怪异

    我正在定义一个宏 该宏的计算结果为常量字符串 保存文件名和行号 用于记录目的 它工作正常 但我只是不明白为什么需要 2 个额外的宏 STRINGIFY and TOSTRING 当直觉简单地表明 FILE LINE include
  • 在 iOS 上的 PhoneGap 或 Cleaver (Cordova) 中加载远程 html

    我在我的本机 iOS 6 应用程序中使用 Cordova 2 4 组件 Cleaver 和嵌入式视图 到目前为止 我已经成功创建了项目结构 链接了 Cordova 库并设置了 Hello World 应用程序 该应用程序确实可以提供 设备就
  • 使用awk对字段进行排序和排列

    我现在正在尝试学习 awk 我想做一项特定的任务 我的问题与之前发布的问题范围相似 使用 awk 将列转置为行 https stackoverflow com questions 13634816 using awk to transpos
  • 如何将多个 .txt 文件读入 R? [复制]

    这个问题在这里已经有答案了 我正在使用 R 来可视化一些数据 所有这些数据都是 txt 格式 一个目录中有几百个文件 我想一次性将其全部加载到一个表中 有什么帮助吗 EDIT 列出文件不是问题 但我在从列表到内容的过程中遇到了困难 我已经尝
  • 我可以在 MySQL 中存储图像吗?

    这个问题在这里已经有答案了 可能的重复 MySQL 中的图像 https stackoverflow com questions 1665730 images in mysql 在 MySQL 中存储图像 https stackoverfl
  • 通过php在csv单元格中创建回车符

    我正在尝试动态生成一个 csv 文件 其中包含一些包含多行的单元格 例如 地址字段需要分组为单个 地址 单元格 而不是地址 城市 州等 一切进展顺利 但在过去的两天里 我尝试在代码中插入 r r n n chr 10 chr 13 以及回车
  • C# IAttachmentExecute

    我正在尝试使用I附件执行 http msdn microsoft com en us library bb776297 28VS 85 29 aspx我的 C 应用程序中的接口 使用 NET4和VS2010 MSDN 说它在Shdocvw
  • 如何在 VSCode 的 zen 模式下启用行号?

    有没有办法在 VSCode 的 zen 模式下启用行号 In your settings json插入行 zenMode hideLineNumbers false
  • SQL Server 存储过程中的可选参数

    我正在写一些存储过程 https en wikipedia org wiki Stored procedure在 SQL Server 2008 中 这里可能存在可选输入参数的概念吗 我想我总是可以传入 NULL 作为我不想使用的参数 检查
  • C#:保留类中构造函数的引用参数

    基本上我希望能够引用类实例内的变量 但我希望引用成为类变量 因此我不需要将其作为参数在类内部发送 code int num 0 myClass num print num output is 0 but i d like it to be
  • Bootstrap 轮播下一个和上一个功能不起作用

    使用最新版本并具有基本的轮播 我已经让它可以使用所有默认设置 但是当尝试添加或停止某些功能时 事情会中断或根本不起作用 我希望能够手动循环浏览图像 不希望它自动循环 我只想使用下一个和上一个按钮来循环 我在这里读过一些帖子 但解决方案不起作
  • 将闪亮应用程序部署到 Shinyapps.io 时出错

    我有一个闪亮的应用程序 它在server R file library shiny Creating the app library ggplot2 library plyr library reshape2 library scales
  • Python 3 urllib 与请求性能

    我正在使用 python 3 5 并且正在检查 urllib 模块与 requests 模块的性能 我用 python 编写了两个客户端 第一个使用 urllib 模块 第二个使用 request 模块 它们都生成二进制数据 我将其发送到基
  • 在循环中初始化变量[重复]

    这个问题在这里已经有答案了 我试图弄清楚初始化某些变量时的最佳实践是什么 我的代码现在看起来像这样 int nHexCount 0 int prevState sc state bool bOnlySpaces true bool bIsV
  • 编译器处理包含保护头的开销有多大?

    为了加速大型源文件的编译 修剪翻译单元中使用的标头数量是否更有意义 或者编译代码的成本是否远远超过处理包含保护的时间标头 如果后者是真的 那么工程工作最好花在创建更多 轻量级的标头上 而不是更少 那么 现代编译器需要多长时间才能处理有效包含
  • 比较 nginx+Apache+mod_wsgi 与 nginx+uWSGI?

    在生产中使用 nginx Apache mod wsgi 与 nginx uWSGI vurtualenv 有何优缺点 我在自 2007 年以来开发的 mod wsgi 中看到了第一个变体的优点 并且具有更稳定的版本和易于管理 第二种变体的
  • Magento 以编程方式删除产品图像

    这肯定是一个非常简单的编程任务 我绝对无法在网上找到任何有关它的信息 基本上 我正在尝试删除产品图像 我想删除产品媒体库中的所有图像 我可以在不为如此简单的任务编写一百万行代码的情况下完成此操作吗 请注意 我已经尝试过 attributes
  • ActiveModel::ForbiddenAttributesError + cancan + Rails 4 + 具有作用域控制器的模型

    我正在使用 cancan 1 6 10 和 Rails 4 0 0 我有一个名为 App 未限定范围 的模型和一个控制器 Admin AppsController 其限定范围 即 app controllers admin apps con
  • 如何为json可序列化对象设置默认值?

    我想设置一个默认值AvailableService 对于原语来说它足够简单 我将如何使用自定义对象来做到这一点 class Submenu extends Equatable JsonKey defaultValue final Strin
  • Identity Server 4 上授权客户端的自定义端点

    我希望我的 Identity Server 4 服务器提供附加服务 例如 MyAdditionalService 对于一些注册客户 他们将通过在服务器上定义的自定义端点来使用该服务 我正在考虑为我的该服务定义一个 API 例如 名为 myA