使用持有者令牌时,带有AD身份验证的Azure函数导致401个未经授权 [英] Azure Function with AD auth results in 401 Unauthorized when using Bearer tokens
问题描述
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);
}
}
当我在浏览器中访问该函数时,一切工作正常(如果没有登录,我必须登录并重定向到我的API)。但是,如果我试图在需要持有者令牌的任何地方访问我的函数,我得到一个401 Unauthorized
错误。更奇怪的是,我还无法在Azure门户中执行该函数。
但令牌已毫无问题地获得并添加到请求中:
我尝试了几种不同的方法来解决这个问题。起初我认为这可能是CORS的问题(因为我也有过几次),只是将CORS设置为接受*,但什么都没有改变。
然后,我已将我的API登录终结点添加到重定向,并尝试将隐式授权设置为也接受访问令牌,但它仍然不起作用。
我有什么遗漏的地方吗?应用注册快速配置不应该只与Azure函数一起使用吗?
编辑:
按照@thomas-schreiter的建议,将我的函数应用程序的URL放在重定向中不会改变任何事情(我已经尝试了屏幕截图中的配置,也只是将这些值各自放在一起)。
编辑2:
我现在也尝试了手动获取持有者令牌with Postman,但在调用我的API时仍然遇到了401。
推荐答案
更新2020-05-12:根据ambrose-leung的答案further below您现在可以添加一个自定义的颁发者URL,这应该可以让您使用v2令牌。我自己还没有尝试过,但这可能会对将来的某个人有帮助。(如果他的答案帮助您,请给他投上一票,或许还可以留下评论😉)
这花了很长时间才弄清楚,官方文件中关于这一点的信息很少。
但问题是Azure函数不支持OAuth2/v2.0/Azure API生成的持有者令牌。由于门户使用这些功能(如果您的AD支持它们),因此您不太幸运能够在其中运行该功能。
这也解释了为什么我的邮递员请求不起作用,因为我也在使用v2 API。切换到v1后,我可以访问我的API(当您使用集成的auth功能时,Postman不允许您添加resource_id,所以我不得不切换到手动处理)。
之后人们意识到,如果您正在编写一个JS客户端(在我的例子中是ANGLE),您也不能使用MSAL。因此,另一种选择是Adal,其棱角分明的实现看起来有点笨拙。因此,我决定使用Angular-OAuth2-oidc,它又花了一个小时的时间才能很好地与Azure AD配合使用。
但在这之后,我终于可以访问我的API了。
我真的不明白为什么你不允许用户使用Azure AD v2令牌访问Azure功能应用程序,但至少这一点应该被更好地记录下来。但不管怎样,我终于可以入睡了。
编辑:在我为此打开一个问题后,他们添加了一条注释,说明Azure函数不支持v2,希望能让其他人的生活更轻松。
https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad
这篇关于使用持有者令牌时,带有AD身份验证的Azure函数导致401个未经授权的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!