【发布时间】: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