【问题标题】:Blazor Application Managing Authorization in a muli-tiered solutionBlazor 应用程序在多层解决方案中管理授权
【发布时间】:2021-11-07 14:24:09
【问题描述】:

我的解决方案由 Blazor 应用程序(带有 .Net 5.0 的服务器端应用程序)和第二个项目组成,即类库(.Net Standard 2.0)。 Blazor 应用程序处理网站的所有方面,包括身份验证。我将所有数据库 CRUD 过程移到了类库中。 Blazor 应用程序进行身份验证并使用角色/声明来授权不同的页面。但是,如何将该授权扩展到我的类库,以便我可以使用相同的类/函数装饰来指定授权角色/声明?这是我的应用程序如何设置的示例:

Blazor 应用 - Startup.cs

Blazor 应用具有对类库和相应“使用语句”的引用。然后我将这些类注入到 ConfigureServices 方法中,以便在页面中使用。

public void ConfigureServices(IServiceCollection services)
{
   //...adding other required services
   //  Inject class from my Class Library
    services.AddTransient<ISqlDataAccess, SqlDataAccess >();
    services.AddTransient<IPeopleData, PeopleData>();
}

这是我如何使用注入的类从我的数据库中提取数据的示例。我可以在这里实现角色访问,但我也想在类库中实现它。

Somepage.Razor

@page "/mysite/people"
@attribute [Authorize(Roles = "admin")]
@using DataAccessLibrary
@using DataAccessLibrary.Models
@inject IPeopleData_db

//html to display data
@code{
 //list of the returned data set, using the model, People
 List<PeopleModel> people = new List<PeopleModel>();
 protected override async Task OnInitializedAsync()
 {
    people = await _db.GetAllPeople();
 }
}

数据访问库

IPeopleData.cs

public interface IPeopleData
{
   Task<PeopleModel> GetAllPeople();      
}

PeopleData.cs

public class PeopleData : IPeopleData
{
  // ISqlDataAccess is a class that handles basic CRUD calls to the database.  Uses Dapper easy object mapping
  private readonly ISqlDataAccess _db;

  public PeopleData(ISqlDataAccess db)
  {
    _db = db;
  }
   public Task<List<PersonModel>> GetAllPeople()
   {
       string sql = "select * from dbo.People";
       return _db.LoadData<PersonModel, dynamic>(sql, new { }); 
   }
}

因此,我可以使用 [Authorize(Roles = "admin")] 将授权属性添加到 Blazor 页面。但是,这并不能保护管理所有数据库连接内容的类库。如何将基于角色的访问控制扩展到该库,以便我可以对我的类/函数使用类似的装饰,例如 [Authorize(Roles = "admin")]?

【问题讨论】:

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


    【解决方案1】:

    直接回答您的问题:没有向标准 DotNetCore 类添加授权的机制,这就是您的库代码。授权应用于组件。

    您需要应用“关注点分离”原则来构建您的应用程序来解决您的问题。

    你需要重新考虑:

    services.AddTransient<ISqlDataAccess, SqlDataAccess >();
    

    它几乎肯定会像筛子一样泄漏内存。 SQL 访问服务应该是 Scoped 或通常是 Singleton。

    【讨论】:

    • 感谢您指出我的服务注入问题。您是否知道任何说明“关注点分离”概念的 Blazor 教程?
    猜你喜欢
    • 2011-04-27
    • 2023-01-28
    • 1970-01-01
    • 2012-08-12
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多