使用持有者令牌时,带有AD身份验证的Azure函数导致401个未经授权 [英] Azure Function with AD auth results in 401 Unauthorized when using Bearer tokens

查看:58
本文介绍了使用持有者令牌时,带有AD身份验证的Azure函数导致401个未经授权的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在C#中有一个非常简单的Azure函数,我已经为它设置了Azure AD Auth。我刚刚使用Express设置在功能配置中创建了一个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);
    }
}

当我在浏览器中访问该函数时,一切工作正常(如果没有登录,我必须登录并重定向到我的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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆