我有一个由Blazor应用程序(带有.Net 5.0的服务器端应用程序)和第二个项目组成的解决方案,即类库(.Net标准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();
}
}DataAccessLibarary
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 { });
}
}因此,我可以使用授权(Roles= "admin")向Blazor页面添加授权属性。但是,这并不能保护管理所有数据库连接内容的类库。如何将基于角色的访问控制扩展到该库,以便我可以使用类似于类/函数的装饰,比如授权(Roles= "admin")
发布于 2021-09-11 18:15:23
要直接回答您的问题:没有向标准DotNetCore类添加授权的机制,这就是您的库代码。授权应用于组件。
您需要构建应用程序,应用“关注点分离”原则来解决问题。
你需要重新考虑:
services.AddTransient<ISqlDataAccess, SqlDataAccess >();它几乎肯定会像筛子一样漏出记忆。SQL访问服务应该限定作用域,或者通常为Singleton。
https://stackoverflow.com/questions/69143263
复制相似问题