NET Core 3.1 Microsoft.Identity.Web 基于角色的授权问题
NET Core 3.1 Microsoft.Identity.Web Role Based Authorization Issue
我正在使用来自 GitHub 的 MS 代码示例“Azure-Samples
/
active-directory-aspnetcore-webapp-openidconnect-v2" 将 .net Core 3.1 webapp 连接到 Azure AD 中的单个租户。
维护此代码示例的 Micorsoft 员工最近在 2020 年 6 月 25 日举办了一次网络研讨会,会上他对在 net core 中使用 AppRoles 进行基于角色的授权进行了高级概述。下图显示了他的演示文稿中显示的代码示例,该示例使用较旧的 NuGet 库 'Microsoft.AspNetCore.Authentication.AzureAD.UI' 来管理登录。
但是在他在 GitHub 上使用的示例项目代码中,他使用了较新的 'Microsoft.Identity.Web' 库,该库似乎没有任何代码部分,我从收到的令牌中提取角色声明在成功登录身份验证后来自 Azure。
供参考:UTUBE 的演示文稿 - 标题 = 使用 Microsoft 身份在您的应用程序中实施授权 platform-June 2020
供参考:MS 代码示例项目 = https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/1-WebApp-OIDC
下面的代码示例:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
// Handling SameSite cookie according to https://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-3.1
options.HandleSameSiteCookieCompatibility();
});
// **THIS ONE LINER HAS REPLACED THE FORMER CODE SECTION FROM THE OLDER LIBRARY**
// Sign-in users with the Microsoft identity platform
services.AddSignIn(Configuration);
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();
services.AddRazorPages();
}
我想通过使用 [Authorize(Roles = "ViewLogs")] 装饰方法在我的 MVC 控制器和 Razor 页面上使用基于角色的访问控制,但是当我登录测试页面时,我得到拒绝访问,所以某处缺少一些必需的代码,我不知道添加什么或在哪里添加所需的代码才能使它正常工作。
我已经验证我在登录后从 Azure 收到的令牌中成功接收到角色“ViewLogs”,只是这里缺少一些重要的东西,.NET Core 需要它来定义角色策略检查令牌中的声明。
下图显示了令牌内容的调试:
这是在 .net core 中使用 msal 角色的官方 ms 示例
https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/5-WebApp-AuthZ/5-1-Roles#support-in-aspnet-core-middleware-libraries
它将角色声明映射到策略和组,然后授权使用该策略,但是,我相信您仍然可以使用角色或组进行授权。
它还使用 microsoft.identity.web (msal)
检查 HttpContext.User.Claims 集合以确保存在 roles
声明,
[编辑]好像是。
确保 app.UseAuthorization(); 行出现在 Configure() 的 Startup.cs 中订单。
从控制器操作中删除 [Authorize] 属性并在这些操作中执行 HttpContext.User.IsInRole() 方法以检查按预期操作的角色。
根据 asp.net 核心团队的建议,样本建议使用新的 Policy-based authorization in ASP.NET Core
如果以上所有方法均无效,则使用提供的步骤重新创建项目 here。请注意 .
我正在使用来自 GitHub 的 MS 代码示例“Azure-Samples / active-directory-aspnetcore-webapp-openidconnect-v2" 将 .net Core 3.1 webapp 连接到 Azure AD 中的单个租户。
维护此代码示例的 Micorsoft 员工最近在 2020 年 6 月 25 日举办了一次网络研讨会,会上他对在 net core 中使用 AppRoles 进行基于角色的授权进行了高级概述。下图显示了他的演示文稿中显示的代码示例,该示例使用较旧的 NuGet 库 'Microsoft.AspNetCore.Authentication.AzureAD.UI' 来管理登录。
但是在他在 GitHub 上使用的示例项目代码中,他使用了较新的 'Microsoft.Identity.Web' 库,该库似乎没有任何代码部分,我从收到的令牌中提取角色声明在成功登录身份验证后来自 Azure。
供参考:UTUBE 的演示文稿 - 标题 = 使用 Microsoft 身份在您的应用程序中实施授权 platform-June 2020
供参考:MS 代码示例项目 = https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/1-WebApp-OIDC
下面的代码示例:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
// Handling SameSite cookie according to https://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-3.1
options.HandleSameSiteCookieCompatibility();
});
// **THIS ONE LINER HAS REPLACED THE FORMER CODE SECTION FROM THE OLDER LIBRARY**
// Sign-in users with the Microsoft identity platform
services.AddSignIn(Configuration);
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();
services.AddRazorPages();
}
我想通过使用 [Authorize(Roles = "ViewLogs")] 装饰方法在我的 MVC 控制器和 Razor 页面上使用基于角色的访问控制,但是当我登录测试页面时,我得到拒绝访问,所以某处缺少一些必需的代码,我不知道添加什么或在哪里添加所需的代码才能使它正常工作。
我已经验证我在登录后从 Azure 收到的令牌中成功接收到角色“ViewLogs”,只是这里缺少一些重要的东西,.NET Core 需要它来定义角色策略检查令牌中的声明。
下图显示了令牌内容的调试:
这是在 .net core 中使用 msal 角色的官方 ms 示例 https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/5-WebApp-AuthZ/5-1-Roles#support-in-aspnet-core-middleware-libraries
它将角色声明映射到策略和组,然后授权使用该策略,但是,我相信您仍然可以使用角色或组进行授权。 它还使用 microsoft.identity.web (msal)
检查 HttpContext.User.Claims 集合以确保存在 roles
声明,
[编辑]好像是。
确保 app.UseAuthorization(); 行出现在 Configure() 的 Startup.cs 中订单。
从控制器操作中删除 [Authorize] 属性并在这些操作中执行 HttpContext.User.IsInRole() 方法以检查按预期操作的角色。
根据 asp.net 核心团队的建议,样本建议使用新的 Policy-based authorization in ASP.NET Core
如果以上所有方法均无效,则使用提供的步骤重新创建项目 here。请注意 .