Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用承载令牌时,带有AD auth的Azure函数会导致401个未经授权_C#_Azure_Azure Active Directory_Azure Functions - Fatal编程技术网

C# 使用承载令牌时,带有AD auth的Azure函数会导致401个未经授权

C# 使用承载令牌时,带有AD auth的Azure函数会导致401个未经授权,c#,azure,azure-active-directory,azure-functions,C#,Azure,Azure Active Directory,Azure Functions,我在C#中有一个非常简单的Azure函数,为此我设置了Azure AD Auth。我刚刚使用Express设置在功能配置中创建了应用程序注册 public static class IsAuthenticated { [FunctionName("IsAuthenticated")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymou

我在C#中有一个非常简单的Azure函数,为此我设置了Azure AD Auth。我刚刚使用Express设置在功能配置中创建了应用程序注册

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);
    }
}
公共静态类已验证
{
[函数名(“已验证”)]
公共静态异步任务运行(
[HttpTrigger(AuthorizationLevel.Anonymous,“获取”,“选项”,路由=null)]
HttpRequest请求,
ILogger日志)
{
返回新的OkObjectResult(“您是”+req.HttpContext.User.Identity.Name);
}
}
当我在浏览器中访问该函数时,一切正常(如果未登录,我必须登录并重定向到API)。但是,如果我试图在需要承载令牌的任何地方访问我的函数,我会得到一个
401未经授权的
错误。更奇怪的是,我也无法在Azure门户中执行该功能

但毫无问题地获得了令牌,并将其添加到请求中:

我尝试了几种不同的方法来解决这个问题。首先,我认为这可能是CORS的问题(因为我也有一些这样的问题),只是将CORS设置为接受*,但没有任何改变

然后,我将API登录端点添加到重定向中,并尝试将隐式授权设置为也接受访问令牌,但仍然不起作用

有什么我忽略了的吗?App registration express配置不应该只与azure功能一起工作吗

编辑:

按照建议将我的函数应用程序的URL放在重定向中并没有改变任何东西(我在屏幕截图中尝试了配置,也只是将这些值中的每一个都放在了重定向中)

编辑2:


我现在也尝试以手动方式获取承载令牌,但调用API时仍遇到401。

在AAD应用程序本身中,转到设置->回复url并验证函数应用程序的url是否在列表中,该列表具有以下格式:
https://mycoolapp.azurewebsites.net
。如果不是,则添加它


如果使用插槽,则必须为两个插槽添加它

我现在唯一能想到的就是允许观众观看

转到Active directory设置并单击高级。在允许的代币观众下 添加准确的函数url。它可能已经存在回调url,但只需将其替换为函数基url,而不需要任何回调,如图所示

确保按“确定”时,您还保存了身份验证/授权设置以使其生效,并在大约1分钟后重试。我测试使用邮递员和传递不记名令牌,它的工作


我今天面临着完全相同的问题。问题是我在请求访问令牌时传递的资源id

例如,最初我请求这样的令牌,使用函数URL作为资源id:

AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync("https://myfunction.azurewebsites.net", "myClientAppIdGUID", new Uri("https://login.live.com/oauth20_desktop.srf"), new PlatformParameters(PromptBehavior.SelectAccount)).Result;
虽然这返回了一个访问令牌,但在使用访问令牌调用函数api时,我收到了一个401未经授权的消息

我更改了代码,将我的函数应用程序Id作为资源传递:

AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync("myFunctionAppIdGUID", "myClientAppIdGUID", new Uri("https://login.live.com/oauth20_desktop.srf"), new PlatformParameters(PromptBehavior.SelectAccount)).Result;

现在一切正常。

更新2020-05-12:根据您的回答,您现在可以添加一个自定义的发卡机构URL,该URL可能使您能够使用v2代币。我自己也没试过,但也许这会对将来的人有用。(如果他的回答对你有帮助,请给他一张赞成票,也许可以给他留言我通过邮递员使用以下配置设法让它工作。 重要的一课是在“允许的令牌访问群体”中设置,在本例中,邮递员用于获取令牌的“资源”名称应相同。我使用了此处提供的相同代码。在本例中,在Azure AD中注册的应用程序也是客户端和资源。通过邮递员进行的配置和测试如下

邮递员代币

使用邮递员..授权标头和承载令牌调用azure函数


您现在可以使用v2.0代币了

在配置AAD时,您必须选择“高级”并在URL末尾添加/v2.0部分,而不是选择“快速”

这是我在控制台应用程序中使用的代码,用于向用户显示登录提示,然后获取承载令牌以用于Azure功能

string[]scopes=新字符串[]{“profile”、“email”、“openid”};
字符串ClientId=[Azure函数的ClientId];
字符串Tenant=[tenantId];
字符串实例=”https://login.microsoftonline.com/";
var\u clientApp=PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority($“{Instance}{Tenant}”)
.WithDefaultRedirectUri()
.Build();
var accounts=_clientApp.GetAccountsAsync().Result;
var authResult=\u clientApp.AcquireTokenInteractive(作用域)
.WithAccount(accounts.FirstOrDefault())
.WithPrompt(Prompt.SelectAccount)
.ExecuteAsync().Result;
var bearerTokenForAzureFunction=authResult.IdToken;

在功能应用程序上设置Active Directory身份验证时,请将管理模式设置为“高级”,并根据需要填写客户端ID和颁发者URL(必要时填写客户端密码)

重要的是,在允许的令牌访问群体下,输入应用程序ID URI。这可以在公开API选项下的注册应用程序注册(在广告中)中找到

这就是我在功能应用程序上进行身份验证时所缺少的。在我添加令牌访问群体之前,我将始终获得带有有效访问令牌的401

这帮助我得到了答案,但我花了一段时间才意识到它指的是什么。记住,在你的应用注册中可以找到的是应用程序ID URI


我希望这会有帮助!

如果你像我和原来的帖子一样把头撞在墙上