首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多层解决方案中的Blazor应用管理授权

多层解决方案中的Blazor应用管理授权
EN

Stack Overflow用户
提问于 2021-09-11 13:00:20
回答 1查看 51关注 0票数 0

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

Blazor应用程序- Startup.cs

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

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
public interface IPeopleData
{
   Task<PeopleModel> GetAllPeople();      
}

PeopleData.cs

代码语言:javascript
复制
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")

EN

回答 1

Stack Overflow用户

发布于 2021-09-11 18:15:23

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

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

你需要重新考虑:

代码语言:javascript
复制
services.AddTransient<ISqlDataAccess, SqlDataAccess >();

它几乎肯定会像筛子一样漏出记忆。SQL访问服务应该限定作用域,或者通常为Singleton。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69143263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档