ASP.NET Core MVC 向 Azure AD 验证用户,然后创建 JWT Bearer Token 以调用 Web API

Posted

技术标签:

【中文标题】ASP.NET Core MVC 向 Azure AD 验证用户,然后创建 JWT Bearer Token 以调用 Web API【英文标题】:ASP.NET Core MVC Authenticate User to Azure AD then create JWT Bearer Token to call Web API 【发布时间】:2017-01-06 23:29:09 【问题描述】:

我正在构建一个 ASP.NET Core Web API,它将由 Azure AD 保护(通过 app.UseJwtBearerAuthentication 保护)

我正在构建一个调用 WebAPIASP.NET Core MVC 控制器(由 app.UseOpenIdConnectAuthentication 保护)。

我正在尝试按照 OpenID Connect 基本客户端实施者指南中的说明实施身份验证流程。

我为此模式找到的示例代码。

这里有一个例子:

/active-directory-dotnet-webapp-webapi-openidconnect/blob/master/TodoListWebApp/App_Start/Startup.Auth.cs)

正在使用 .NET(不是 .NET Core)和 OWIN

您使用OnAuthorizationCodeReceived 方法并调用AcquireTokenByAuthorizationCodeAsynch 来获取您将在对WebAPI 的请求中使用的令牌。

当我尝试在 ASP.NET Core MVC 中构建类似的模式时,我看到以下内容:

    当我配置 MVC 的应用程序时。 UseOpenIdConnectAuthentication 使用默认值,然后我可以登录系统,但我没有得到授权码。为我触发的事件是OnTokenValidated 事件,而不是上面显示的AuthorizationCodeReceived 事件。它有一个身份和一个令牌,这很棒。 当我配置 MVC 的应用程序时。 UseOpenIdConnectAuthentication response-type = “code”,然后我得到一个代码,OnAuthorizationCodeReceived 事件触发,但我没有得到任何身份。

[我的天蓝色应用程序清单是为oauth2AllowImplicitFlow: true 设置的。在这种情况下,用户身份验证和令牌生成被压缩为一个步骤,这并不像我需要的那样安全,所以我设置为 false。]

经过进一步调查,我了解到 Asp.Net Core 基础架构旨在处理多个单独的身份验证中间件条目,并且

Microsoft.AspNetCore.Authentication.JwtBearer / JwtBearerHandler.cs

如果您尝试将SignIn 工作流与JwtBearer 配置一起使用,

被编码为抛出“不允许”错误。

因此,看来我将不得不遵循多中间件方法。一个用于登录的基于 cookie 的中间件,一个用于承载令牌的基于承载令牌的中间件,以访问链接到此应用程序的服务。 (而不是 OWIN 示例中的模型,在该示例中,在接收到身份验证码后调用服务完成)

这个特性(多个认证中间件)在https://docs.asp.net/en/latest/security/authorization/limitingidentitybyscheme.html中有描述

有人有这方面的例子吗?还是我还在想这个错误?

【问题讨论】:

关于这个话题你有什么要分享的吗?我正在尝试做几乎相同的事情,但我无法使用 ASP.Net Core 找到该主题的任何好的示例。 【参考方案1】:

如果您还需要获取身份和代码,您应该在您的请求中指定这一点 => response_type=code+id_token

在检索到两者后,我希望您能够为您的用户设置 cookie 并请求客户端身份验证和令牌。

我很确定Authorize access to web applications using OpenID Connect and Azure Active Directory 中描述了确切的场景。

【讨论】:

以上是关于ASP.NET Core MVC 向 Azure AD 验证用户,然后创建 JWT Bearer Token 以调用 Web API的主要内容,如果未能解决你的问题,请参考以下文章

Azure 云服务上的 Asp.Net Core MVC?

Azure AD 与 ASP.NET Core MVC 中的标识

使用 Azure AD 的 Asp.net core mvc 基于角色的授权

从托管在 Azure 中的 Asp.net Core MVC Web App 获取“响应状态代码不表示成功:502(错误网关)”

从 Azure 中托管的 ASP.NET Core 5.0 MVC 站点调用 API/服务的间歇性套接字异常

如何在 ASP.NET Core MVC 中使用 ADO.NET 向存储过程添加参数?