亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ASP.NET 核心 Web API:基于數據庫權限的授權

ASP.NET 核心 Web API:基于數據庫權限的授權

C#
波斯汪 2022-11-21 16:56:46
我正在尋找一種解決方案/建議來幫助我創建基于權限的對 Web API 端點/控制器操作的訪問?;诮巧脑L問是不合適的,因為我沒有可以在 Role("Admin") 或 Role("Controller") 等代碼中使用的固定規則?;诼暶鞯臋嘞抟膊豢尚?,因為每個用戶/客戶可以對每個業務對象/實體擁有不同的權限(例如,讀取/寫入訪問自己的票證和讀取訪問他/她公司的所有票證,或者如果它是我的技術人員公司可以完全訪問所有客戶的所有票據。因此,每個用戶都會有 10s 甚至數百個索賠,我必須在每次訪問我的 API 時對其進行評估。這是數據庫中的某種多租戶,租戶是我們的客戶,擁有某種可以訪問所有租戶數據的“主租戶”。我認為像 Visual Guard 這樣的東西可以滿足我的需求,但它非常昂貴,而且他們現在不支持 net core,而且他們的文檔似乎已經過時了。我不需要立即找到可用的解決方案,但我會非常感謝一些提示和技巧,因為我現在正在尋找和搜索一些時間。關于“數據庫權限”的詳細信息: 我的意思是在我的前端(Winforms 應用程序)我想建立一個安全系統,我可以在其中創建角色并將其分配給用戶,并且在這些角色中定義了用戶可以執行哪些操作以及哪些 CRUD 操作他/她可以對特定的業務對象進行操作。每個角色可以有 n 個用戶,每個角色可以有 n 個權限。每個權限本身聲明為 exmaple Create:false、Read:true、Write:true 和 Delete:false。如果未找到特定業務對象的權限,則完全拒絕該 BO 上的 CRUD。因此,每當我的 API 中的一個操作被調用時,我必須檢查該用戶和他/她的規則是否允許他根據我的數據庫中的規則和權限執行該特定操作。詳細說明應用程序結構: 前端將是一個 Winforms 應用程序,它通過 OData 在后臺調用 API。我不想完全依賴 Winforms 應用程序的安全性,因為 API 可以從互聯網訪問,我不能確定用戶是否不會嘗試使用他的憑據訪問 api 只是為了看看沒有什么是可能的“前端過濾器”。因此,權限位于 API 中,如果用戶嘗試在前端應用程序中訪問 st,則應用程序本身會“詢問”API 是否可行。稍后我想創建也使用 Odata Web API 的移動客戶端。
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

asp.net core中相關的API有:


授權服務

授權策略

授權要求

IAuthorizationHandler

您正在尋找的授權模式稱為 Resource-based authorization


https://learn.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-2.2


基本上,您可以定義 AuthorizationPolicy,并將其應用于資源實例:


var ticket = _ticketRepository.Find(ticketID);


var authorizationResult = await _authorizationService

        .AuthorizeAsync(User, ticket, "EditTicketPolicy");

在授權處理程序中,您可以檢查用戶是否是資源的所有者。

public class ResourceOwnerRequirement : IAuthorizationRequirement

{

}


public class ResourceOwnerHandler 

    : AuthorizationHandler<ResourceOwnerRequirement, MyBusinessObject>

    //: AuthorizationHandler<ResourceOwnerRequirement> use this overload to handle all types of resources...

{

    protected override Task HandleRequirementAsync(

        AuthorizationHandlerContext context, 

        ResourceOwnerRequirement requirement, 

        MyBusinessObject resource)

    {

        int createdByUserId = resource.CreatedBy;

        Claim userIdClaim = ((ClaimsIdentity)context.User.Identity).FindFirst("UserId");


        if (int.TryParse(userIdClaim.Value, out int userId)

            && createdByUserId == userId)

        {

            context.Succeed(requirement);

        }

    }

}


//admin can do anything

public class AdminRequirementHandler : IAuthorizationHandler

{

    public Task HandleAsync(AuthorizationHandlerContext context)

    {

        if (context.User.Claims.Any(c => c.Type == "Role" && c.Value == "Administator"))

        {

            while (context.PendingRequirements.Any())

            {

                context.Succeed(context.PendingRequirements.First());

            }

        }

        return Task.CompletedTask;

    }

}

順便說一句,這仍然可以稱為聲明或基于角色的授權。具有特定角色的用戶可以編輯自己的工單,但具有管理員角色的用戶還可以編輯其他工單。不同之處在于您將授權應用于資源,而不僅僅是操作


查看完整回答
反對 回復 2022-11-21
  • 1 回答
  • 0 關注
  • 134 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號