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
保护)
我正在构建一个调用 WebAPI 的 ASP.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 AD 与 ASP.NET Core MVC 中的标识
使用 Azure AD 的 Asp.net core mvc 基于角色的授权
从托管在 Azure 中的 Asp.net Core MVC Web App 获取“响应状态代码不表示成功:502(错误网关)”