我的目标是使用Azure AD保护我的Azure功能并从WPF应用程序中调用它们。
我有一个具有以下定义的Azure函数:
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
HttpRequest req,
ILogger log,
ExecutionContext context,
ClaimsPrincipal claimsPrincipal)
我注册了Azure AD应用并配置了本机应用身份验证的设置:
我还添加了API权限
我将我的应用程序与身份验证/授权刀片中的Azure Functions应用程序相关联。
我正在WPF应用程序中从Azure AD这样获得令牌(使用Microsoft.Identity.Client库)
string applicationID = "***"; // My AppID Guid
PublicClientApp = PublicClientApplicationBuilder.Create(applicationID)
.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
.Build();
var listScopes = new List<string>
{
//"user.read" - Removed based on @tony-yu recommendation
$"api://{applicationID}/MyScope"
};
var authResult = await PublicClientApp.AcquireTokenInteractive(listScopes)
.ExecuteAsync();
var myToken = authResult.AccessToken;
我可以毫无问题地进行身份验证,并且可以成功获取令牌,但是每当我调用函数并在Authorization标头(Authorization = Bearer ****)中提供令牌时,我都会得到:
401-您无权查看此目录或页面。
这就是我所说的(邮递员):
这是电话返回时的WWW-Authenticate标头内容
当我检查我获得的令牌时,似乎合法
知道我在做什么错吗?
答案 0 :(得分:0)
范围不正确。当您要访问受广告保护的功能时,您需要使用
var listScopes = new List<string>
{
"{applicationID}/.default"
};
相反。
user.read
是Microsoft Graph API的权限。
答案 1 :(得分:0)
因此,SO article的ambrose-leung终于使我得以成功工作