Sta*_*eff 12 c# azure azure-active-directory azure-functions
我在C#中有一个非常简单的Azure函数,已经为其设置了Azure AD Auth。我刚刚使用Express设置在Function配置中创建了App注册。
public static class IsAuthenticated
{
[FunctionName("IsAuthenticated")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "options", Route = null)]
HttpRequest req,
ILogger log)
{
return new OkObjectResult("You are " + req.HttpContext.User.Identity.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中访问该函数时,一切都会按预期进行(如果未登录,则必须登录并重定向到我的API)。但是,如果我在任何需要Bearer令牌的地方尝试访问我的函数,都会收到401 Unauthorized错误消息。即使很奇怪,我也无法在Azure门户中执行该功能。

但是获取令牌没有问题,并将其添加到请求中:
我已经尝试了一些其他方法来解决此问题。首先,我认为这可能是CORS问题(因为我也有一些问题),只是将CORS设置为接受*,但没有任何变化。
然后,我将我的API登录端点添加到了重定向中,并尝试将隐式授予设置为也接受Access令牌,但它仍然无法正常工作。
有什么我忽略的吗?App Registration Express配置不应该只与Azure函数一起使用吗?
编辑:
按照@ thomas-schreiter的建议,将URL放入功能应用程序的重定向中没有做任何更改(我已经尝试了屏幕截图中的配置,也只是将每个值单独放置了)。
编辑2:
我现在也尝试用Postman手动方式获取Bearer令牌,但是在调用API时仍然遇到401。
Sta*_*eff 13
这花了很长时间才弄清楚,而且官方文档中对此的信息很少。
但是事实证明,问题是Azure函数不支持oauth2 / v2.0 / Azure API生成的Bearer令牌。由于门户网站使用了这些功能(如果您的AD支持它们的话),因此您很幸运能够在其中运行该功能。
这也解释了为什么我的邮递员请求不起作用的原因,因为我也在使用v2 API。切换到v1后,我可以访问我的API(在使用集成身份验证功能时,邮差不允许您添加resource_id,因此我不得不切换为手动处理所有内容)。
之后,意识到如果您正在编写JS客户端(在我的情况下为Angular),也不能使用MSAL。因此,可以选择ADAL,其中Angular实现看起来有些尴尬。因此,我决定使用angular-oauth2-oidc,这花了一个小时的时间才能使它与Azure AD完美配合。
但毕竟,我终于可以访问我的API。
我真的不明白为什么您不允许用户使用Azure AD v2令牌访问Azure Function应用程序,但是至少应该对此进行更好地记录。但是无论如何,我终于可以入睡了。
编辑:在我为此打开一个问题之后,他们添加了一条注释,即Azure Functions不支持v2,希望使其他人的生活更轻松。
https://docs.microsoft.com/zh-cn/azure/app-service/configure-authentication-provider-aad
我设法通过邮递员使用以下配置使其工作。重要的一课是在“允许的令牌受众”中进行设置,在这种情况下,邮递员用于获取令牌的“资源”名称应相同。我使用了此处提供的相同代码。在这种情况下,在Azure AD中注册的应用程序也是客户端和资源。通过邮递员进行配置和测试,如下所示
在邮递员中获取令牌
使用带有承载令牌的Postman .. Authorization标头调用Azure函数
您现在可以使用 v2.0 代币了!
在配置 AAD 时,不要选择“Express”,而必须选择“Advance”并在 URL 末尾添加 /v2.0 部分。
这是我在控制台应用程序中使用的代码,用于向用户显示登录提示,然后获取不记名令牌以与 Azure 函数一起使用。
string[] scopes = new string[] { "profile", "email", "openid" };
string ClientId = [clientId of Azure Function];
string Tenant = [tenantId];
string Instance = "https://login.microsoftonline.com/";
var _clientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority($"{Instance}{Tenant}")
.WithDefaultRedirectUri()
.Build();
var accounts = _clientApp.GetAccountsAsync().Result;
var authResult = _clientApp.AcquireTokenInteractive(scopes)
.WithAccount(accounts.FirstOrDefault())
.WithPrompt(Prompt.SelectAccount)
.ExecuteAsync().Result;
var bearerTokenForAzureFunction = authResult.IdToken;
Run Code Online (Sandbox Code Playgroud)
小智 5
在 Function App 上设置 Active Directory 身份验证时,将管理模式设置为高级,并根据需要填写客户端 ID 和颁发者 URL(如有必要,还可以填写客户端密钥)。
重要的是,在“允许的令牌受众”下,输入“应用程序 ID URI”。这可以在您注册的应用程序注册(在您的 AD 中)的“公开 API”选项下找到。
这就是我在功能应用程序上进行身份验证所缺少的。在添加该令牌受众之前,我总是会收到带有有效访问令牌的 401。
这个Azure Active Directory - 允许令牌受众帮助我得到了答案,但我花了一段时间才意识到它指的是什么。请记住,它是可以在您的应用程序注册中找到的应用程序 ID URI。
我希望它有帮助!
| 归档时间: |
|
| 查看次数: |
1587 次 |
| 最近记录: |