ASP.NET Core Web API项目使用Azure AD保护API

如果您正在构建一个由Azure AD保护的Web API,那么您需要进行身份验证来测试该API。在Swagger中配置OAuth 2允许您使用Swagger UI进行身份验证,并使用必要的身份验证头测试API。

配置的步骤是:

  1. 创建一个Web API项目
  2. 为Web API注册一个Azure AD (AAD)应用程序
  3. 更新Web API项目以使用Azure AD身份验证
  4. 为Swagger注册一个AAD应用程序
  5. 为Swagger AAD应用程序授予访问Web API AAD应用程序的权限
  6. 为Swagger AAD应用程序生成一个客户端秘密
  7. 在Swagger AAD应用程序上启用OAuth2隐式流
  8. 在Web API项目中添加Swagger

下面的例子是一个使用Swashbuckle.AspNetCore 3.0.0:的 Net Core 2.1 Web API应用程序。

1. 创建一个Web API项目

第一步是使用Visual Studio或通过命令行创建一个新的Web API项目:

md AspNetCore.AzureAd.Swagger
cd AspNetCore.AzureAd.Swagger
dotnet new webapi

如果您在Visual Studio中打开并运行项目,您应该会看到从默认控制器返回的值。

2. 在Azure AD中注册一个应用(Web API)

要对Azure AD进行身份验证,您需要添加一个Azure AD应用程序注册。这可以通过Azure门户http://portal.azure.com完成。

http://portal.azure.com > Azure Active Directory > App Registrations > New application registration

当应用程序注册完成后,将应用程序ID复制到记事本中,因为我们稍后会用到它

3. 更改Web API项目以使用 Azure AD authentication

添加以下 nuget package

Microsoft.AspNetCore.Authentication.AzureAD.UI

在 Startup.cs 文件中, 将以下代码加入到ConfigureServices 方法中

services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme)
           .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.AddMvc(config =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);            

这将需要对所有请求进行身份验证。

另外在 Startup.cs 文件中 添加以下代码到Configure 方法中(在 app.UseMvc() 之前):

app.UseAuthentication();

在 appsettings.json 文件中,添加以下信息 (在使用源代码控制之前,请记住将敏感信息移出此处,例如使用管理用户机密):

国际版:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "<Domain>",
  "TenantId": "<Directory ID>",
  "ClientId": "<Application ID>"
},
"Swagger": {
  "ClientId": "<Swagger:Application ID>",
  "ClientSecret": "<Swagger:Key Value>"
}

大陆版:

"AzureAd": {
  "Instance": "https://login.chinacloud.cn/",
  "Domain": "<Domain>",
  "TenantId": "<Directory ID>",
  "ClientId": "<Application ID>"
},
"Swagger": {
  "ClientId": "<Swagger:Application ID>",
  "ClientSecret": "<Swagger:Key Value>"
}

将步骤2中的应用程序ID复制到ClientId值中,并从Azure门户获取域和目录,如下所示:

在 ValuesController.cs 文件中, 修改 Get 请求方法包含用户名,以便我们可以验证请求已经过身份验证。

public ActionResult<IEnumerable<string>> Get()
{
  return new string[] { "value1", User.Identity.Name };
}

运行应用程序并验证它返回一个401未经授权的错误(因为浏览器没有提供身份验证令牌):

4. 注册一个Azure AD应用程序(Swagger)

现在,我们将为Swagger web站点添加一个AAD应用程序,并授予它向web API应用程序发出请求的权限。

http://portal.azure.com > Azure Active Directory > App Registrations > New application registration.

在URL字段中输入在步骤1中创建的项目的基本URL,然后输入/swagger/ oaut2 -redirect.html。

将应用程序ID复制到appsettings中的Swagger:ClientId设置中。在步骤3中创建的json

Settings > Reply URLs > 确保重定向URL 为 https://localhost:<web api port>/swagger/oauth2-redirect.html

5. 为Swagger AAD应用程序授予访问Web API AAD应用程序的权限

Settings > Required Permissions > Add > Select an API > My Api

选中 ‘Access Web API’, 点击完成

6. 为Swagger AAD应用程序生成一个客户端密钥

Settings > Keys >

在appsettings.config中复制key值到Swagger:ClientSecret设置中。

7.在Swagger AAD应用程序上启用OAuth2隐式流

编辑清单文件并将oauth2AllowImplicitFlow更改为true

8. 在Web API项目中添加Swagger

添加以下NuGet包

swashbuckle.aspnetcore (测试使用3.0.0)

在 Startup.cs 文件中添加以下代码到 ConfigureServices 方法中:

services.AddSwaggerGen(c =>
{
  c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
  c.AddSecurityDefinition("oauth2", new OAuth2Scheme
  {
    Type = "oauth2",
    Flow = "implicit",
    AuthorizationUrl = $"https://login.microsoftonline.com/{Configuration["AzureAD:TenantId"]}/oauth2/authorize",
    Scopes = new Dictionary<string, string>
    {
      { "user_impersonation", "Access API" }
    }
  });
  c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
  {
    { "oauth2", new[] { "user_impersonation" } }
  });
});

添加以下代码到 Configure 方法中:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
  c.OAuthClientId(Configuration["Swagger:ClientId"]);
  c.OAuthClientSecret(Configuration["Swagger:ClientSecret"]);
  c.OAuthRealm(Configuration["AzureAD:ClientId"]);
  c.OAuthAppName("My API V1");
  c.OAuthScopeSeparator(" ");
  c.OAuthAdditionalQueryStringParams(new { resource = Configuration["AzureAD:ClientId"] });
  c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

在Visual Studio中更改开始页面以打开swagger

运行项目并验证您可以在单击“Authorize”按钮后验证和访问API。

您现在应该可以看到在授权头中传递的承载身份验证令牌,以及在结果中显示的登录用户的身份。



原文地址:https://www.cnblogs.com/zmsoftbj/p/11725564.html

时间: 2024-08-29 11:48:02

ASP.NET Core Web API项目使用Azure AD保护API的相关文章

ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

 一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自己的职业发展还是很有帮助的.毕竟,现在都快到9102年了,如果你还是只会 Web Form,或许还是能找到很多的工作机会,可是,这真的不再适应未来的发展了.如果你准备继续在 .NET 平台下进行开发,适时开始拥抱开源,拥抱 ASP.NET Core,即使,现在工作中可能用不到. 雪崩发生时,没有一

ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地订阅来自于某个渠道的事件消息,并对接收到的消息进行处理,于此同时,它还能够向该渠道发送事件消息,以便订阅该事件消息的消费者能够对消息数据做进一步处理.让我们回顾一下微服务之间通信的几种方式,分为同步和异步两种.同步通信最常见的就是RESTful API,而且非常简单轻量,一个Request/Resp

asp.net core web api token验证和RestSharp访问

对与asp.net core web api验证,多种方式,本例子的方式采用的是李争的<微软开源跨平台移动开发实践>中的token验证方式. Asp.net core web api项目代码: 首先定义三个Token相关的类,一个Token实体类,一个TokenProvider类,一个TokenProviderOptions类 代码如下: /// <summary> /// Token实体 /// </summary> public class TokenEntity

ASP.NET Core Web API Cassandra CRUD 操作

在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将使用 Postman 来完成. ASP.NET Core 是 ASP.NET 的重大的重构,ASP.NET Core 是一个全新的开源和跨平台的框架,用于构建如 Web 应用.物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序. ASP.NET Core 已经内置了用 MVC 架

docker中运行ASP.NET Core Web API

在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任

在docker中运行ASP.NET Core Web API应用程序

本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任务,需要准备以下环境: Visual Studio 2015,或者Vi

Docker容器环境下ASP.NET Core Web API

Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在自己做实验的过程中也碰到了一些问题,经过一些测试和搜索资料,基本解决了这些问题,本文也会对这些问题进行介绍,以免有相同需求的朋友多走弯路. 插件的下载与安装 至撰写本文为止,Visual Studio 2015 Tools

在 Azure 上部署 Asp.NET Core Web App

在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App 服务是个很好的选择. 下面我们会通过 Visual Studio 创建一个 Asp.net Core demo 应用,然后把这个 demo 应用部署到 Azure Web App.通过阅读本文,您将能了解到如何创建 Asp.NET Core 应用程序和如何在Azure上创建 Web App 并部署

Gitlab CI 自动部署 asp.net core web api 到Docker容器

为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成.监控报警.以及扩容和高可用性的问题.是学习和探索的过程分享给大家,也欢迎同行的人交流. 先来一个三步曲,我们将完成通过GitLab CI 自动部署 net core web api 到Docker 容器的一个示例.这是第一步,通过此文您将了解如何将net core web api 运行在Docker