【问题标题】:ASP.Net Core 5.0 Authentication and AuthorizationASP.Net Core 5.0 身份验证和授权
【发布时间】:2021-04-16 08:12:48
【问题描述】:

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

我能够读出 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>();

    }

据我了解,此功能无法使用

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

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

【问题讨论】:

    标签: c# asp.net asp.net-core blazor-server-side


    【解决方案1】:

    到目前为止,我所做的是阅读文档 Authentication and Authorization in ASP.NET Core BlazorRolebased Authorization in Asp.NET Core。一世 设法让身份验证运行,但我正在努力 授权。我想存储每个 Windows 用户 在数据库中访问我的服务器端应用程序并说 User1 是管理员, User2 是 Editor 等,向用户展示页面的不同区域。

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

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

    Introduction to Identity on ASP.NET Core

    Scaffold Identity in ASP.NET Core projects.

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

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

    2. 生成数据库和身份架构:

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

       add-migration InitialCreate
       update-database
      

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

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

       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() 方法将指定用户添加到命名角色。你可以参考this article

    3. 在 Pages 文件夹中创建管理页面和普通页面。

      AdminPage.razor:

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

      NormalPage.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>
      

      运行应用,结果如下:

    参考:

    Role Based Authorization In Blazor

    how to use usermanager on a blazor page?

    【讨论】:

    • 感谢您的快速回复!但是我无法连接到数据库。我确实创建了 InitialCreate 和 update-database,但 VS 中没有显示任何数据库。 SSMS 在我的电脑上也找不到任何内容,这意味着它没有创建或我没有正确连接?
    • 嗨@Tim,您使用的是哪个版本的VS?在我的机器上,我使用的是 VS 2019 16.8.3 版本,您可以尝试将 VS 版本升级到最新版本并在安装 VS 时选择the "Data Storage and processing"。另外,请检查appsetting.json文件中的连接字符串,应该是这样的:Server=(localdb)\\mssqllocaldb;Database=aspnet-BlazorAuthSample;Trusted_Connection=True;MultipleActiveResultSets=true,如果你使用的是同一个服务器,数据库应该在C:\Users\{your current user}文件夹下,你可以检查一下。
    • 根据appsetting.json文件中的连接字符串,是否可以从文件夹中找到数据库。点击VS 2019中的“查看”,选择SQL Server Object Explorer,刷新SQL Server,如果还是找不到数据库,点击VS 2019中的查看,选择Server Explorer,点击“Connect to”数据库”图标,在添加连接对话框中,点击浏览器按钮找到数据库,测试连接后点击确定按钮,勾选这个screenshot,就可以查看数据库中的表了。
    • 非常感谢!它现在对我有用。我确实安装了与您相同的 VS,因此我能够使用 SQL Server 对象资源管理器找到数据库。我想我明白这一点更好知道。对于我的理解,我确实有一些关于该主题的后续问题:1)角色表示为 GUID,所以如果我想管理用户帐户,我必须更改 dbo.AspNetUserRoles 中的 RoleId,这可以通过你所指的函数来完成? 2)如何通过在.pages中对角色进行相同的检查来实现允许管理员查看正常也看到的任何内容?这可以通过索赔来完成吗?
    • 嗨@Tim,关于第一个问题,在使用Asp.net Core Identity时,我们可以使用UserManger和RoleManger来管理用户和角色,该类包含许多相关方法,你可以在网上搜索它们,那里有很多关于它的文章。通过使用它们,我们可以以编程方式管理用户和角色。参考this article
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2017-01-23
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多