Azure 函数本地 ClaimsPrincipal

4

我正在使用 Azure AD 认证的 Azure Function。在 Azure 上部署后,一切都正常。

    public static async Task<IActionResult> ExportT(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ClaimsPrincipal principal,
        ILogger log)
    {
        var c = principal.Claims.Select(x => x.Value);

        return new OkObjectResult(c);

    }

返回:

[ "38a1e83b-c1d3-4fd7-bdc6-ef2447", "https://sts.windows.net/635e38ef-108e-4a26-b718-bbd532/", "1564501257", "1564501257", "1564505157", "42FgYFCuNWnL3ROWG9x3p4EzN3+c/6u8Gh5jV7sT0A", "pwd", "test", "test", "92.169.93", "test", "36fbab-425b-9d65-b2425ef3d9bf", "a1c1ee35-67ab-4f3a-2877c5580b1e", "ES_SALARIED", "XboeusxsxyvnjhCT_vJHkzncPE2JBU58Q50", "635e38ef-26-b718-bbd960991532", "testdedev@ins.coop", "testdedev@ins.coop", "PJ0vEo70o0G__HrwX8ghAA", "1.0" ]

但是在使用 VS2019 本地执行时,我遇到了以下问题:

[ "Admin" ]

有什么想法吗?

谢谢,


我假设在Azure中,您已经使用Azure AD身份验证保护了您的函数?如果是这样,在本地运行时,这显然不会生效。 - silent
1
是的,你说得对,但因为我正在传递授权标头,所以我希望能够在ClaimsPincipal中获取我的身份 :( 看起来这并不像想象的那么简单(如此解释:https://dev59.com/XlcP5IYBdhLWcg3wTYYn#48240085)。我想我需要模拟一些身份对象来在本地使用。 - Sauget Charles-Henri
你在这里想要实现什么? - HariHaran
尝试在本地和部署时以相同的方式使用我的ClaimPrincipal对象... 以相同的方式检索身份验证。(就像我的例子一样) - Sauget Charles-Henri
也许您可以交叉检查您的访问策略,以便在Azure中使管理员拥有与您的应用程序运行身份相同的权限。我相信这将给您带来相同的结果。 - nldev
1个回答

1
我找到的最接近实现此功能的方法是使用这个repo写作时的提交)中的示例。
在AuthenticationService示例中,我在验证声明后添加了context.User = claimsPrincipal;
从那里开始,在我的HTTP触发器上可以执行以下操作:
[Authorize]
[FunctionName("AuthTest")]
public async Task<IActionResult> AuthTest(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "test")] HttpRequest req)
{
    // Current user identity returned
    // (quickly thrown together as you get a circular reference error when converting to JSON):
    return new OkObjectResult(
       req.HttpContext.User.Identities.Select(x =>
          new {
                 Claims = x.Claims.Select(y => new
                    {
                        y.Type,
                        y.Value,
                        y.Issuer,
                        y.Properties
                    }),
                 x.Name,
                 x.Actor,
                 x.AuthenticationType,
                 x.NameClaimType
                })
            );
 }

准备好了吗?

如果您有访问令牌,您可以在标头中使用JWT令牌,然后执行GET:http://localhost:7071/api/test

E.g:

enter image description here

你还需要:

注意事项

这不是使用“易用身份验证”(easy auth)的方法。我选择了这种方法,因为我想使用支持AAD V2的MSAL.NET。但我发现AAD V2尚未支持:

目前,Azure应用服务和Azure函数不支持AAD V2(包括MSAL)。请关注更新。 参考

我曾经为此付出了很大的努力。如果您需要在推送到生产环境之前测试应用程序,那么“Easy auth”似乎不是一个选项。即使在得到这个答案后,我也不知道如何使授权变得像normal Web API policy方法一样简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接