MSAL - 即使未在 'API Permissions' 中配置应用程序也可以请求权限
MSAL - Application can request permission even if it's not configured in 'API Permissions'
我使用请求范围 api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope2
的 MSAL 库创建了一个小型 .NET Core 3.1 控制台应用程序
自定义 API 公开两个作用域
- api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope1
- api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope2
我还在 Azure Active Directory 中配置了另一个名为 test-app
的应用程序,它代表我的控制台应用程序。
我只为此应用程序配置了一个 API 权限 (api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope1
)。我的理解是使用此配置,客户端应用程序将只能请求范围 test1
,并且不允许 test-app
请求 scope2
下面是截图
这是我的代码:
//<PackageReference Include="Microsoft.Identity.Client" Version="4.13.0" />
namespace console_client
{
class Program
{
static void Main(string[] args)
{
#region Azure AD parameters
var clientId = "dddeefa5-d95c-4931-a53d-2382deee27c3";
var tenant = "-- MY TENANT ID--";
var instance = "https://login.microsoftonline.com/";
#endregion
var client = PublicClientApplicationBuilder
.Create(clientId)
.WithDefaultRedirectUri()
.WithAuthority($"{instance}{tenant}")
.Build();
List<string> scopes = new List<string>();
try
{
// I was under impression that this call will throw as exception as
// this app is requesting 'testscope2' which is not included in API Permissions
// while configuring test-app in Azure Active Directory (dddeefa5-d95c-4931-a53d-2382deee27c3 )
// But I was able to retrieve token back with testscope2 in it.
scopes.Add("api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope2");
var authenticationResult = client.AcquireTokenInteractive(scopes).ExecuteAsync().Result;
Console.WriteLine($"Interactive Access token is : {authenticationResult.AccessToken}");
}
catch (Exception ex)
{
System.Console.WriteLine($"******* {ex.Message}");
}
}
}
}
问题
我错过了什么吗?为什么即使应用程序没有配置权限,我也会取回访问令牌?
谢谢
TL;DR 这是一项功能。
使用 v2 终结点/MSAL,您可以请求应用清单中未定义的范围。
您的应用程序注册中的那些是您的应用程序所需的 static 权限。
但是您的应用程序也可以在登录时请求 dynamic 权限。
当然,user/admin 仍然需要同意,应用程序不会在未经同意的情况下获得许可。
您的应用似乎是单租户应用,因此这对您来说并没有什么不同。
它主要用于多租户 SaaS 应用程序,这些应用程序可以在应用程序中要求所需的最低权限 registration/manifest,然后在需要时为选择加入功能请求更多权限。
顺便说一句,如果您想使用在您的应用注册中定义的权限,您可以请求一个特殊的范围:api://55a047a1-a0d1-4b6b-9896-751a848e1e06/.default
(您的应用 ID URI 或客户端 ID +“/.default”)。
这将使 AAD 查看您的应用程序注册,以决定检查哪些权限。
我使用请求范围 api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope2
自定义 API 公开两个作用域
- api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope1
- api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope2
我还在 Azure Active Directory 中配置了另一个名为 test-app
的应用程序,它代表我的控制台应用程序。
我只为此应用程序配置了一个 API 权限 (api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope1
)。我的理解是使用此配置,客户端应用程序将只能请求范围 test1
,并且不允许 test-app
请求 scope2
下面是截图
这是我的代码:
//<PackageReference Include="Microsoft.Identity.Client" Version="4.13.0" />
namespace console_client
{
class Program
{
static void Main(string[] args)
{
#region Azure AD parameters
var clientId = "dddeefa5-d95c-4931-a53d-2382deee27c3";
var tenant = "-- MY TENANT ID--";
var instance = "https://login.microsoftonline.com/";
#endregion
var client = PublicClientApplicationBuilder
.Create(clientId)
.WithDefaultRedirectUri()
.WithAuthority($"{instance}{tenant}")
.Build();
List<string> scopes = new List<string>();
try
{
// I was under impression that this call will throw as exception as
// this app is requesting 'testscope2' which is not included in API Permissions
// while configuring test-app in Azure Active Directory (dddeefa5-d95c-4931-a53d-2382deee27c3 )
// But I was able to retrieve token back with testscope2 in it.
scopes.Add("api://55a047a1-a0d1-4b6b-9896-751a848e1e06/testscope2");
var authenticationResult = client.AcquireTokenInteractive(scopes).ExecuteAsync().Result;
Console.WriteLine($"Interactive Access token is : {authenticationResult.AccessToken}");
}
catch (Exception ex)
{
System.Console.WriteLine($"******* {ex.Message}");
}
}
}
}
问题
我错过了什么吗?为什么即使应用程序没有配置权限,我也会取回访问令牌?
谢谢
TL;DR 这是一项功能。
使用 v2 终结点/MSAL,您可以请求应用清单中未定义的范围。 您的应用程序注册中的那些是您的应用程序所需的 static 权限。 但是您的应用程序也可以在登录时请求 dynamic 权限。 当然,user/admin 仍然需要同意,应用程序不会在未经同意的情况下获得许可。
您的应用似乎是单租户应用,因此这对您来说并没有什么不同。 它主要用于多租户 SaaS 应用程序,这些应用程序可以在应用程序中要求所需的最低权限 registration/manifest,然后在需要时为选择加入功能请求更多权限。
顺便说一句,如果您想使用在您的应用注册中定义的权限,您可以请求一个特殊的范围:api://55a047a1-a0d1-4b6b-9896-751a848e1e06/.default
(您的应用 ID URI 或客户端 ID +“/.default”)。
这将使 AAD 查看您的应用程序注册,以决定检查哪些权限。