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中打开并运行项目,您应该会看到从默认控制器返回的值。

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

 

 

 

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

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

 

 

 

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

 

 

 

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

 

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

 

 

 

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门户获取域和目录,如下所示:

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

 

 

 

 

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

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

 

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

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

 

 

 

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。

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

 

 

 

 

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

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

 

 

 

 

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

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

 

 

 

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

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

 

 

 

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

Settings > Keys >

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

 

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

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

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

 

 

 

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

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

 

 

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

 

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

 

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

 

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

 

 

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

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

 

 

 

 




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

上一篇:Win10 下不能正常使用Multilink解决办法


下一篇:win10 docker redis配置及启动