ASP.NET Web API 和 OpenID Connect:如何从授权代码获取访问令牌

2024-01-02

我尝试让 OpenID Connect 运行...我的 Web API 的用户设法获取 OpenID Connect 提供商的授权代码。我应该如何将此代码传递到我的 ASP.NET Web API?我必须如何配置 OWIN 中间件才能使用授权代码获取访问令牌?

更新: SPA 使用 AJAX 与我的 Web 服务 (ASP.NET Web API) 进行通信。在我的网络服务中使用 OWIN 中间件。我将 OpenIDConnect 设置为身份验证机制。第一次调用 Web 服务时,它成功地将用户重定向到 OpenID Connect 提供商的登录页面。用户可以登录并获得授权码。据我所知,现在可以(由我的网络服务)使用此代码来获取访问令牌。但是,我不知道如何将此代码返回到我的 Web 服务(这是使用标头完成的吗?),然后配置什么来获取访问令牌。我想我可以手动调用令牌端点,但我想利用 OWIN 组件。


BenV 已经回答了这个问题,但还有更多需要考虑。

class partial Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        // ...

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
          {
            ClientId = clientId,
            Authority = authority,
            Notifications = new OpenIdConnectAuthenticationNotifications() {
                AuthorizationCodeReceived = (context) => {
                   string authorizationCode = context.Code;
                   // (tricky) the authorizationCode is available here to use, but...
                   return Task.FromResult(0);
                }
            }
          }
    }
}

两个问题:

  • 首先,authorizationCode很快就会过期。储存它没有任何意义。
  • 第二个问题是AuthorizationCodeReceived只要授权代码未过期并存储在会话中,任何页面重新加载都不会触发该事件。

你需要做什么是打电话AcquireTokenByAuthorizationCodeAsync这将缓存它并在内部正确处理TokenCache.DefaultShare:

AuthorizationCodeReceived = (context) => {
    string authorizationCode = context.Code;
    AuthenticationResult tokenResult = await context.AcquireTokenByAuthorizationCodeAsync(authorizationCode, new Uri(redirectUri), credential);
    return Task.FromResult(0);
}

现在、之前every调用资源,调用AcquireTokenSilentAsync获取 accessToken (它将使用 TokenCache 或静默使用刷新令牌)。如果令牌过期,它将引发AdalSilentTokenAcquisitionException异常(调用访问代码更新过程)。

// currentUser for ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier")
AuthenticationResult authResult = await context.AcquireTokenSilentAsync(resourceUri, credential, currentUser);

Calling AcquireTokenSilentAsync如果令牌被缓存的话,速度会非常快。

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

ASP.NET Web API 和 OpenID Connect:如何从授权代码获取访问令牌 的相关文章

  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 在搜索 List 时,为什么 Enumerable.Any(Func predicate) 比带有 if 语句的 foreach 慢

    最近有件事引起了我的好奇心 Why is the Enumerable Any Func
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 如何在没有 user_impersonation OAuth2Permission 的情况下创建新的 Azure 应用程序注册?

    我想知道 Azure 专家中是否有人可以澄清New AzureADApplication https learn microsoft com en us powershell module azuread new azureadapplic
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 如何将文件放入 Django 的固定装置中?

    我可以轻松地使用文件名填充 Django 固定装置中的 FileField 或 ImageField 字段 但该文件不存在 当我尝试测试我的应用程序时 它会失败 因为该文件不存在 如何在 Django 固定装置中正确填充 FileField
  • 自动实现的属性必须定义 get 和 set 访问器

    SQLCLR Visual Studio 2015 我是编写 CLR 代码的新手 编译 SQL CLR 函数时出现以下错误 我正在使用 Net 坐标库 https www doogal co uk dotnetcoords php 有问题的
  • 从字符串动态导入文件中的方法

    我有一个字符串 说 abc def ghi jkl myfile mymethod 如何动态导入mymethod 以下是我的做法 def get method from file full path if len full path 1 r
  • 将handlebars变量传递给客户端js文件

    我正在使用 Node js Express Handbars 构建一个应用程序 并正在寻找一种可以将车把数据从服务器传递到客户端 JavaScript 文件的方法 例如 server js var person name George ag
  • C 语言有哪些 XML API?

    它们都这么复杂吗 http msdn microsoft com en us library ms766497 VS 85 aspx http msdn microsoft com en us library ms766497 VS 85
  • 计算机多久会犯一次错误?

    我指的不是编程错误 这些错误实际上是由人类以某种方式造成的 而是在执行像将两个数字相加这样简单的操作时出现的错误 1 x 中预期出现错误的 x 范围是多少 就 CPU 而言 存在三种可能的错误来源 这些错误似乎在您的问题范围内 浮点舍入错误
  • 如何管理 ASP.NET 中触发事件的顺序?

    这个问题看似微不足道 但我没有通过谷歌找到答案 如果我在网络表单中有多个独立的控件 例如DropDownLists 和网格 我需要在另一个事件处理程序中使用来自一个事件处理程序的回发信息 因此我需要让它一次又一次地正确触发 我看到很多间接的
  • 针对多个 Web 请求的最佳多线程方法

    我想创建一个程序来爬行并检查我的网站是否有 http 错误和其他内容 我想使用多个线程来执行此操作 这些线程应该接受要抓取的 url 等参数 虽然我希望 X 线程处于活动状态 但仍有 Y 任务正在等待执行 现在我想知道执行此操作的最佳策略是
  • 为什么使用存储库模式或者请向我解释一下?

    我正在学习存储库模式并正在阅读使用 Entity Framework 4 1 和 Code First 的存储库模式 http www codeproject com Tips 309753 Repository Pattern with
  • 我们声明结构体的两种方式有什么区别?

    作为 C 的初学者 我正在学习链表和其他数据结构 在网上查看了一些实现之后 我发现了他们定义结构的两种方式 两者有什么区别 在一种情况下 我们在下一个指针之前添加 struct 而在另一种情况下我们没有 Way 1 struct node
  • 如何使用Jquery检索wordpress的ajax搜索结果

    我需要设置 wordpress ajax 搜索结果 但我的方法在单击按钮时不会检索结果 而是将我重定向到另一个网站 myurl com s term 我正确调用了 admin ajax php 但设置不正确 有什么想法导致问题吗 Scrip
  • 无法使用 Cypress.io 测试页脚的背景颜色,它会抛出错误

    无法使用 Cypress io 测试背景颜色 在运行 cypress 测试时会抛出以下错误 CypressError 重试超时 actual equals 不是函数 通过安装的 chai colorsnpm install chai col
  • Frontpage 服务器扩展安装问题

    这是我的故事的前言 https stackoverflow com questions 5856880 vs unable to create website found 我的 VS 或 IIS 有问题 我不知道 在 Visual Stud
  • 文本区域占位符不起作用

    我编写了下面的文本区域代码 但占位符不起作用 我在文本区域框中看不到占位符
  • 有没有办法以编程方式确定 Apple 内置控件的正确尺寸?

    在编写 Cocoa 应用程序时 我以编程方式完成大部分用户界面布局 例如 NSRect popUpFrame NSMakeRect 10 10 100 kDefaultPopUpButtonHeight NSPopUpButton popU
  • 现代 GPU 上制服的分支成本

    在现代 GL3 3 GPU 上使用 GLSL 时 在统一上进行分支的可能成本是多少 在我的引擎中 我已经达到了拥有大量着色器的程度 我为其中的很多预设了几种不同的质量预设 就目前情况而言 我在着色器中使用带有 if 的制服来选择不同的质量预
  • 如何使用 Numba 加速 Python 中 scipy.sparse.linalg 中提供的稀疏线性系统求解器?

    我希望使用 Numba 加速我的代码的稀疏系统求解器部分 这是我到目前为止所拥有的 Both numba and numba scipy packages are installed I am using PyCharm IDE impor
  • C++中WIN32和_WIN32定义有什么区别

    我知道WIN32表示 win32 编译但是什么是 WIN32用于 详细说明一下 Neil Butterworth 和 blue tuxedo 已经给出了正确答案 WIN32由SDK或构建环境定义 因此不使用实现保留的命名空间 WIN32定义
  • iOS UIWebView 中的客户端证书身份验证

    我是 Objective C 的新手 但我正在开发一个应用程序 它有一个 UIWebView 可以加载一些网页内容 所有网页都需要客户端证书进行身份验证 我在露水的日子里一直在努力解决这个问题 有谁知道如何在 UIWebView 中实现它的
  • ASP.NET Web API 和 OpenID Connect:如何从授权代码获取访问令牌

    我尝试让 OpenID Connect 运行 我的 Web API 的用户设法获取 OpenID Connect 提供商的授权代码 我应该如何将此代码传递到我的 ASP NET Web API 我必须如何配置 OWIN 中间件才能使用授权代