使用 App Roles 在 ASP.NET Core 中使用 Microsoft Entra ID 进行基于角色的简单授权
本博客文章介绍了使用Microsoft Identity Platform配置和实现基于角色的授权所需的步骤。我们将
- 在 Microsoft Entra ID 中配置身份验证和授权
- 构建简单的 ASP.NET Core 最小 API 应用程序,该应用程序通过身份验证和基于应用程序角色的授权进行保护
- 通过创建新的 OAuth2 访问令牌在 Postman 中进行身份验证以测试 API
先决条件
确保您已准备好/安装了以下物品:
- 对 Microsoft Entra ID 的管理访问权限
- Microsoft Graph PowerShell SDK
- 您最喜欢的 .NET IDE,例如 Visual Studio
- 邮差
配置应用程序注册
要使用 Microsoft Entra ID 为任何应用程序创建添加身份验证和授权以及创建应用程序角色,首先需要先在 Entra ID 中创建应用程序注册。这可以通过 Azure 门户或使用 Microsoft Graph API(例如通过 PowerShell)来完成。
让我们从登录开始。使用正确的范围来执行所需的操作非常重要。在我们的例子中,我们要创建一个新的应用程序注册:
连接-MgGraph-范围“Application.ReadWrite.All”
我们的应用注册需要针对我们的用例进行一些配置,因此让我们为这些配置定义一些变量。第一个变量定义了一个重定向 Uri,我们稍后想通过 Postman 进行身份验证时使用它:
$publicClientApplication = @{
RedirectUris=@( “https://oauth.pstmn.io/v1/callback” )
}
我们还需要定义至少一个可以在身份验证时请求访问的范围。因此,我们需要为我们的应用程序定义标识符 Uri 以及范围本身:
$identifierUris = @( “api://myapp” )
$apiApplication = @{
Oauth2PermissionScopes = @(
@{
Id=$(New-Guid)
值= “full”
AdminConsentDescription= “完全访问”
AdminConsentDisplayName= “完全访问”
IsEnabled= $true
类型= “用户”
UserConsentDescription= “完全访问”
UserConsentDisplayName= “完全访问”
}
)
}
现在我们可以描述应用程序角色,例如管理员和贡献者:
$appRoles = @(
@{
Id=$(New-Guid)
Value= "admin"
DisplayName= "Administrator"
Description= "管理员可以管理一切"
AllowedMemberTypes=@( "User" )
}
@{
Id=$(New-Guid)
Value= "contributor"
DisplayName= "Contributor"
Description= "贡献者可以写入和读取数据"
AllowedMemberTypes=@( "User" )
}
)
将配置定义为变量后,我们可以继续创建实际的应用程序注册:
$application = New-MgApplication `
-DisplayName'MyApp'` -
SignInAudience'AzureADMyOrg'` - PublicClient $ publicClientApplication` - IdentifierUris $identifierUris` - Api $apiApplication - AppRoles $ appRoles`
为了能够稍后将用户分配给应用程序角色,我们还需要为应用程序注册创建一个服务主体:
$servicePrincipalId =@{ “AppId” = $application .AppId }
新建 MgServicePrincipal -BodyParameter $servicePrincipalId
为用户分配角色
若要将用户分配给应用程序角色,在 PowerShell 中登录时需要一组不同的范围:To allocate user to app role, sign in in PowerShell to the same user’s role:
连接-MgGraph-范围“AppRoleAssignment.ReadWrite.All,User.ReadWrite.All”
要创建新的应用程序角色分配,我们需要要分配的用户的用户 ID、应用程序角色的 ID 和服务主体的 ID。让我们查找它们。首先让我们检索新创建的应用程序注册:
$application = Get-MgApplication -Filter “DisplayName eq‘MyApp’”
在那里我们可以找到应用程序角色和它的 id:
$adminAppRoleId = $( $application .AppRoles |其中{ $_ .value -eq "admin" }).Id
我们可以用同样的方式查找服务主体:
$servicePrincipal = Get-MgServicePrincipal -Filter “DisplayName eq‘MyApp’”)
我们手上有 ID,现在可以创建应用程序角色分配:
$userId = “{YOUR_USER_GUID}”
New-MgUserAppRoleAssignment `
-UserId $userId` -
AppRoleId $adminAppRoleId` -
PrincipalId $userId` -
ResourceId $ servicePrincipal.Id
构建演示 API 应用程序
现在是时候构建一个简单的 ASP.NET Core Minimal API 应用程序并使用 Microsoft Identity Platform 的一部分开源 Microsoft.Identity.Web 库来保护它了。因此,让我们创建一个新项目并从 Nuget添加Microsoft.Identity.Web 。
配置 Entra ID
要将新创建的应用程序注册用于我们的应用程序,我们需要在项目的appsettings.json中提供一些配置值:
{
“AzureAd” : {
“实例” : “https://login.microsoftonline.com/” ,
“TenantId” : “{YOUR_TENANT_ID}” ,
“ClientId” : “{YOUR_APPLICATION_CLIENT_ID}” ,
“受众” : “api://MyApp”
}
}
添加身份验证
要添加身份验证,我们需要为 Microsoft.Identity.Web 包含一个 using 语句。然后,我们可以从该库中添加身份验证服务,并通过引用“AzureAD”对象使用我们刚刚在 appsettings.json 中添加的配置对其进行配置。最后,我们还需要使用身份验证:
使用Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration,“AzureAd” );
var app = builder.Build();
app.UseAuthentication();
app.Run();
添加基于角色的授权
这是有趣的部分:我们通过为应用程序注册中创建的每个角色创建新策略来利用应用程序角色:
构建器.服务.添加授权(选项 =>
{
选项.添加策略(“管理员”,策略 => 策略.RequireRole(“管理员”));
选项.添加策略(“贡献者”,策略 => 策略.RequireRole(“贡献者”));
});
添加并保护端点
通过在我们的应用程序中配置身份验证和授权,我们可以创建两个示例端点并通过引用我们刚刚创建的策略来保护它们:
app.MapGet( "/" , () =>
{
返回 "Hello World" ;
}).RequireAuthorization( "contributor" );
app.MapPost( "/" , () =>
{
返回 "Hello World" ;
}).RequireAuthorization( "admin" );
就这么简单!
使用 Postman 进行测试
最后我们使用 Postman 来测试我们的 API 端点。由于这些端点受到保护,我们需要先登录 Entra ID,获取 OAuth2 访问令牌并将其用于我们的 http 请求的授权标头中。
让我们在 Postman 中创建一个新请求,并在授权 > 类型:OAuth 2.0 中配置一个新的令牌:
对于 Auth URL 使用:https://login.microsoftonline.com/{ YOUR_TENANT_ID}/oauth2/v2.0/authorize
对于访问令牌 URL,请使用:https://login.microsoftonline.com/{YOUR_TENANT_ID }/oauth2/v2.0/token
点击“获取新的访问令牌”进行登录。登录成功后我们可以查看和使用访问令牌:
获取令牌后,我们现在可以在本地调用我们的演示应用程序并测试角色是否正确执行。
结论
0/token](https://login.microsoftonline.com/{YOUR_TENANT_ID}/oauth2/v2.0/token)
点击“获取新的访问令牌”进行登录。登录成功后我们可以查看和使用访问令牌:
[外链图片转存中…(img-cg3dTPQF-1722244460230)]
获取令牌后,我们现在可以在本地调用我们的演示应用程序并测试角色是否正确执行。
结论
Microsoft Entra ID 中的应用角色提供了一种简单的方法来实现简单场景的基于角色的授权。Microsoft Identity Platform 及其开源库使在 ASP.NET Core 中保护 API 的身份验证和授权变得简单。Postman 可用于从 Microsoft Entra ID 请求 OAuth 2.0 访问令牌,从而方便测试受保护的 API。
博客原文:专业人工智能技术社区