如何在使用 .NET Core 3.1 通过 Visual Studio 2019 开发 Azure Functions 时使用 AD 身份验证

Posted

技术标签:

【中文标题】如何在使用 .NET Core 3.1 通过 Visual Studio 2019 开发 Azure Functions 时使用 AD 身份验证【英文标题】:How to use AD authentication while developing Azure Functions through Visual Studio 2019 using .NET Core 3.1 【发布时间】:2021-04-10 06:15:05 【问题描述】:

我正在使用 .NET Core 3.1 中的 Visual Studio 2019 开发 Azure Functions。我必须为这些功能实现 Azure AD 身份验证。我知道如何在 ASP.NET Core 3.1 Web 应用程序中使用 AD 身份验证。但是由于 Azure Function 中默认没有提供启动类,那么如何实现相同的逻辑呢?

我在 ASP.NET Core 3.1 Web 应用程序中使用此代码:

public void ConfigureServices(IServiceCollection services)

     services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApi(Configuration, "AzureAd");


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    app.UseAuthentication();
    app.UseAuthorization();

并在控制器方法中添加[Authorize] 标签。但是,我无法弄清楚如何在 Azure 函数中实现相同的功能。在这里,我目前已将授权级别设置为匿名,如下所示

public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ILogger log)


这里如何实现 Azure AD 身份验证?

----更新---- 添加 Tiny-wa 建议的配置后,当我发送不记名令牌时,仍然无法弄清楚为什么 Api 以 401 响应

【问题讨论】:

【参考方案1】:

我有一个函数,里面有一个http触发器,在我为该函数启用认证之前,我可以通过调用url直接得到响应。

我关注 this document 为其启用 azure 广告身份验证。

选择您的功能 -> 进入身份验证/授权选项卡 -> 选中“开启”。

然后选择“使用 azure ad 登录”,单击 azure ad 作为身份验证提供者,跳转到新页面,选择 express 并创建新的广告应用程序。

保存所有配置后,当我调用上面的 url 时,它会要求我登录。

================================更新=============== ======================

Http 触发器可以通过添加配置来设置不同的授权级别,而那些设置为匿名的不同级别,我们需要在请求 url 中添加参数。这个document 提供了一个示例,来自微软的this one 提供了详细信息。

==============================update2================= =============

我找到了另一种可能适合您的解决方案。这是sample。

在函数代码中添加身份验证模块后,您可以将函数公开为 azure ad 中的 api。这会使用访问令牌调用您的函数应用。当然样品我试过了,这是我的经验。

首先,修改 Constants.cs 中的配置,然后创建一个 azure 广告应用并公开一个 api。接下来,添加刚才暴露的api权限。最后添加用于生成访问令牌的客户端密码。下面是一些关于我的操作的屏幕截图。

【讨论】:

在代码中使用什么授权级别?在 .NET Core Web 应用程序的早期,我曾经使用来自 azure 门户的令牌端点生成令牌,这给了我一个承载令牌,我将它作为授权标头传递。我正在使用范围默认的客户端凭据工作流来生成令牌。生成令牌不是问题,而是如何验证令牌以及如何在此处放置 [authorize] 标签。你能用一段工作代码解释一下吗? 正如你上面所说的'Azure中默认不提供启动类',在我看来azure函数是一个代码sn-p,所以我的想法是通过配置而不是通过代码启用身份验证。那么,您启用身份验证的目的是什么?如果只是让您租户中的一些用户可以使用此功能,那么我在答案中提供的文档可以满足您的要求。我不知道您为什么专注于编码,或者您能否提供有关您的问题的更多详细信息? 就像在 .net 核心 Web 应用程序中一样,您在希望进行身份验证的控制器方法上使用 [Authorize] 标签,而不是在不需要它们的地方使用标签。但是,如果您正在进行配置,则无法将身份验证添加到所需的控制器方法中,而是将身份验证添加到所有控制器方法中。有什么解决办法吗? 您好,根据您的回复,您可能希望设置每个触发器都有自己的身份验证级别,所以我找到了this document,它描述了如何使 http 触发器具有不同的身份验证级别。跨度> @RahulDev 有什么进展吗?你的问题解决了吗?

以上是关于如何在使用 .NET Core 3.1 通过 Visual Studio 2019 开发 Azure Functions 时使用 AD 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 3.1 的另一个应用程序中包含用户管理器

如何在 ASP.NET Core 3.1 中使用 Java?

使用 Azure.Storage.Blobs 通过 .NET Core 3.1 生成 SAS 到期令牌

如何在.Net Core 3.1中异步地将一个对象序列化为JSON并写入管道?

如何在 ASP.NET Core 3.1 中启用多重身份验证?

如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?