如何在使用 .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 身份验证的主要内容,如果未能解决你的问题,请参考以下文章