繁体   English   中英

ASP.Net Core 5.0 身份验证和授权

[英]ASP.Net Core 5.0 Authentication and Authorization

我对 Blazor 很陌生,我正在尝试了解身份验证和授权。 到目前为止,我所做的是阅读ASP.NET Core Blazor 中的文档 Authentication and Authorization 和 Asp.NET Core 中的基于角色的授权 我设法让身份验证运行,但我正在努力获得授权。 我想将访问我的服务器端应用程序的每个 windows 用户存储在数据库中,并说 User1 是 Admin,User2 是 Editor 等,并向用户显示页面的不同区域。

我能够读出 Windows 用户,但直到现在我无法设置角色。 我尝试过这样的claims

public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {

        var identity = new ClaimsIdentity(new[]
        {
        new Claim(  type: ClaimTypes.Name, value: @"User1")
        }, "Editor");


        var user = new ClaimsPrincipal(identity);

        return Task.FromResult(new AuthenticationState(user));
    }
}

我将它附加到ConfigureServices

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();

        services.AddAuthorizationCore();

        services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();

    }

据我了解,这个 function 不能与

<AuthorizeView Roles="Editor">
   <p>Show User Identity: @context.User.Identity</p>
</AuthorizeView>

razor页面上,因为Roles根本不是Claims 但是我如何告诉我的应用程序 User1 在角色“编辑器”中,而 User2 在角色“管理员”中? 还是有另一种方式来询问用户声明并向用户显示页面的不同区域? 我错过了什么吗?

到目前为止,我所做的是阅读ASP.NET Core Blazor 中的文档 Authentication and Authorization 和 Asp.NET Core 中的基于角色的授权 我设法让身份验证运行,但我正在努力获得授权。 我想将访问我的服务器端应用程序的每个 windows 用户存储在数据库中,并说 User1 是 Admin,User2 是 Editor 等,并向用户显示页面的不同区域。

在官方文档(您正在阅读)中,基于角色的授权是通过 Asp.net Core Identity 实现的。 您可以从Add Role services to Identity中找到它。

在此处输入图像描述

因此,您可以参考以下文章来配置您的应用程序以使用 Asp.net 核心标识。

ASP.NET内核上的Identity介绍

ASP.NET 核心项目中的脚手架标识

此外,根据您的描述,您正在使用数据库来存储用户帐户,看来您正在使用个人用户帐户。 您可以参考以下示例在 asp.net 核心 Blazor 应用程序中实现基于角色的授权。

  1. 创建一个 asp.net 核心 Blazor 服务器应用程序并选择“个人用户帐户”类型并保留默认的“将用户帐户存储在应用程序中”以存储 SQL 本地身份框架表。

    在此处输入图像描述

  2. 生成数据库和 Indentity Schema:

    在 Package 管理器控制台工具中使用以下命令。 更多详细信息,请查看EF Core Migrations

     add-migration InitialCreate update-database

    之后,使用SQL Server Management Studio(SSMS)查看数据库中的表:

    在此处输入图像描述

    打开 Startup.cs 文件,使用以下更改修改“ConfigureServices”方法(添加.AddRoles<IdentityRole>(); )。 这样我们就可以在应用程序中使用身份角色来控制授权。

     public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true).AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>(); services.AddRazorPages(); services.AddServerSideBlazor(); services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>(); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddSingleton<WeatherForecastService>(); }

    运行应用程序,并注册两个用户: adminuser@hotmail.comnormaluser@hotmail.com

    然后,您可以从dbo.AspNetUsers表中找到用户(通过 SSMS):

    在此处输入图像描述

    打开 SSMS,右键单击dbo.AspNetRoles表并单击“查看数据”,并添加两个角色(Id 为 Guid):

    在此处输入图像描述

    打开 SSMS,右键单击dbo.AspNetUserRoles表并单击“查看数据”,将用户 ID 和角色 ID 复制到此表并为用户添加角色。

    在此处输入图像描述

    如果您不想使用此方法将角色添加到特定用户,可以使用UserManager.AddToRoleAsync()方法将指定用户添加到命名角色。 你可以参考这篇文章

  3. 在 Pages 文件夹中创建 Admin 页面和 Normal 页面。

    AdminPage.razor:

     @page "/adminpage" @attribute [Authorize(Roles = "admin")] <h3>AdminPage</h3> @code { }

    正常页面.Razor

     @page "/adminpage" @attribute [Authorize(Roles = "admin")] <h3>AdminPage</h3> @code { }

    使用以下更改修改共享组件“NavMenu”。

     <AuthorizeView Roles="admin"> <li class="nav-item px-3"> <NavLink class="nav-link" href="adminpage"> <span class="oi oi-list-rich" aria-hidden="true"></span> Admin Page </NavLink> </li> </AuthorizeView> <AuthorizeView Roles="normal"> <li class="nav-item px-3"> <NavLink class="nav-link" href="normalpage"> <span class="oi oi-list-rich" aria-hidden="true"></span> Normal Page </NavLink> </li> </AuthorizeView>

    运行应用程序,结果如下:

    在此处输入图像描述

参考:

Blazor 中基于角色的授权

如何在 blazor 页面上使用用户管理器?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM