国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

asp.net core 一種基于token 和 Permission 的權限管理中間件示例

這篇具有很好參考價值的文章主要介紹了asp.net core 一種基于token 和 Permission 的權限管理中間件示例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

asp.net core webapi 下面,想做一個過濾權限的Filter,配合token,對api做一個較為細粒度的權限控制,

該filter (PermissionFilter) 的作用是用戶LoginUser.Permissions 列表中有 Key指定的權限才可以訪問,沒有則返回403 錯誤碼。

?

1. 先上封裝后的使用效果

        [Permission(Key = "/User/AddUser")]
        [HttpPost]
        public Result AddUser([FromBody] SaUser user)
        {
            //Do sth.
            throw new NotImplementedException();
        }
     [Authorize]
        [HttpPost]
        public Result<UserInfoDto> GetUserInfo()
        {
             //Do sth.
        }   
?

說明:要求登錄即可,不要求特定權限的,可以使用【Authroize】 attribute 標記,

  要求 特定權限 如? ?"/User/AddUser" 的 ,使用 【Permission】特性標記,使用Key指定需要的權限。 沒有登錄的返回401, 沒有權限的返回403.

?

2. 實現(xiàn)。主要類及接口說明:

    LoginUser : 登錄用戶,包含用戶基礎信息,權限等??梢岳^承此類封裝更多信息。

namespace WebUtils
{
    public class LoginUser
    {
        public string EnterpriseId { get; set; }
        public string UserName { get; set;} 

        public string Token { get; set; }

        public DateTime LoginTime { get; set;}
        /// <summary>
        /// 可用權限
        /// </summary>
        public HashSet<string> Permissions { get; set;}
    }
}

?

    ITokenHelper <TUser>: 管理用戶登錄后的token,并根據(jù)token 獲取登錄用戶信息。TUser 是LoginUser 的子類。?

namespace WebUtils
{
    public interface  ITokenHelper<TUser>  where TUser :LoginUser 
    {
        public void AddToken(string token, TUser user);
        public void RemoveToken(string token);
        public TUser GetLoginUser (string token);
    }
}

?

    TokenHelper 是 ITokenHelper<LoginUser> 的默認實現(xiàn),LoginUser 和Token 存內(nèi)存中,進程重啟會丟失。實際應用可以封裝自己的實現(xiàn),把信息持久化到數(shù)據(jù)庫或者Redis 中。

asp.net core 一種基于token 和 Permission 的權限管理中間件示例asp.net core 一種基于token 和 Permission 的權限管理中間件示例
namespace WebUtils
{
    public class TokenHelper : ITokenHelper<LoginUser>
    {
        
        private Dictionary<string, LoginUser> UserDic = new Dictionary<string, LoginUser>();
        
        public void AddToken(string token, LoginUser au)
        { 
            UserDic.Add(token, au);
        }
         

        public LoginUser GetLoginUser(string token)
        {
            if (UserDic.ContainsKey(token))
            {
                return UserDic[token];
            }
            return null;
        }

        public void RemoveToken(string token)
        {
            if (UserDic.ContainsKey(token))
            {
                UserDic.Remove(token);
            }
        }
    }
}
View Code

?

    PermissionAuthenticationHandler:檢查請求是否攜帶token,并檢查TokenHelper 中是否包含此token.

asp.net core 一種基于token 和 Permission 的權限管理中間件示例asp.net core 一種基于token 和 Permission 的權限管理中間件示例
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Primitives;
using System;
using System.Net;
using System.Security.Claims;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using WebUtils;

namespace WebUtils
{
    public class PermissionAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
    {
        private ITokenHelper<LoginUser> _tokenHelper;
        public PermissionAuthenticationHandler(ITokenHelper<LoginUser> tokenHelper, IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
            : base(options, logger, encoder, clock)
        {
            this._tokenHelper = tokenHelper;
        }
        public static string CustomerSchemeName = "Permission";
        protected override Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            AuthenticateResult result;
            Context.Request.Headers.TryGetValue("Authorization", out StringValues values);
            string token = values.ToString();
            if (!string.IsNullOrWhiteSpace(token))
            {
                var loginInfo = _tokenHelper.GetLoginUser(token);

                if (loginInfo == null)
                    result = AuthenticateResult.Fail("未登陸");
                else
                {
                    var claimsIdentity = new ClaimsIdentity(new Claim[]
                        {
                                new Claim(ClaimTypes.Name, loginInfo.UserName),
                                new Claim(ClaimHelper.EnterpriseId,loginInfo.EnterpriseId),
                                new Claim(ClaimHelper.Token, loginInfo.Token)
                        }, CustomerSchemeName);
                    var principal = new ClaimsPrincipal(claimsIdentity);


                    AuthenticationTicket ticket = new AuthenticationTicket(principal, Scheme.Name);

                    result = AuthenticateResult.Success(ticket);
                }
            }
            else
            {
                result = AuthenticateResult.Fail("未登陸");
            }
            return Task.FromResult(result);
        }
    }
}
View Code

?

    PermissionAttribute: 繼承自 Attribute,IFilterFactory ,返回真正的IAuthorizationFilter實例。

    DonotUsePermissionFilterAttribute 繼承自?Attribute, IAuthorizationFilter 檢查是否擁有指定的權限。

asp.net core 一種基于token 和 Permission 的權限管理中間件示例asp.net core 一種基于token 和 Permission 的權限管理中間件示例
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WebUtils
{
    [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
    public class PermissionAttribute : Attribute,IFilterFactory
    {
        public string Key { get; set; }

        public bool IsReusable => false;

        public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
        {
            var instance= serviceProvider.GetService<DonotUsePermissionFilterAttribute>();
            instance.Key = this.Key;
            return instance;
        }
    }

    /// <summary>
    /// 防止用戶直接調(diào)用,起名DonotUse, 
    /// </summary>
    public class DonotUsePermissionFilterAttribute : Attribute, IAuthorizationFilter
    {
        private ITokenHelper<LoginUser> _tokenHelper;
        public DonotUsePermissionFilterAttribute(ITokenHelper<LoginUser> tokenHelper)
        {
            this._tokenHelper = tokenHelper;
        }
        public string Key { get; set; }
 
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var token = context.HttpContext.User?.GetValue(ClaimHelper.Token);
            if (token == null)
            {
                context.Result = new ObjectResult("用戶未登錄") { StatusCode = 401 };
                return;
            }
            var user = _tokenHelper.GetLoginUser(token);
            if (user == null)
            {
                context.Result = new ObjectResult("用戶token 已失效") { StatusCode = 401 };
                return;
            }
            if (!user.Permissions.Contains(Key))
            {
                context.Result = new ObjectResult("鑒權失敗,請聯(lián)系管理員授權!") { StatusCode = 403 };
                return;
            }
        }
    }
}
View Code

?

    

    PermissionMiddleWare 把相關實例和PermissionAuthenticationHandler添加到Service 中。

asp.net core 一種基于token 和 Permission 的權限管理中間件示例asp.net core 一種基于token 和 Permission 的權限管理中間件示例
using Microsoft.Extensions.DependencyInjection;

namespace WebUtils
{
    public static class PermissionMiddleWare
    {
        /// <summary>
        /// 基于token和permission 的權限認證中間件
        /// </summary>
        /// <param name="services"></param>
        /// <param name="TokenHelperType"></param>
        /// <returns></returns>
        public static IServiceCollection AddPermission(this IServiceCollection services,Type TokenHelperType)
        {
            services.AddSingleton(typeof(ITokenHelper<LoginUser>), TokenHelperType);

            services.AddTransient(typeof(PermissionAttribute));
            services.AddTransient(typeof(DonotUsePermissionFilterAttribute));
            services.AddAuthentication(o =>
            {
                o.DefaultAuthenticateScheme = PermissionAuthenticationHandler.CustomerSchemeName;
                o.DefaultChallengeScheme = PermissionAuthenticationHandler.CustomerSchemeName;
                o.AddScheme<PermissionAuthenticationHandler>(PermissionAuthenticationHandler.CustomerSchemeName, PermissionAuthenticationHandler.CustomerSchemeName);
            });


            return services;
        }
    }
}
View Code

?3. 在program.cs 中調(diào)用

  在原來添加AddAuthorization 的地方換成下面這句

  builder.Services.AddPermission(typeof(TokenHelper));

  別忘了后面use

            app.UseAuthentication();
            app.UseAuthorization();

?文章來源地址http://www.zghlxwxcb.cn/news/detail-451665.html

到了這里,關于asp.net core 一種基于token 和 Permission 的權限管理中間件示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • ASP.NET CORE WEBAPI 登錄 JWT 鑒權 ,接口權限驗證

    介紹 當今Web開發(fā)中,API的使用越來越廣泛,而API的安全性也變得越來越重要。其中,JWT(JSON Web Token)鑒權和授權是一種常見的解決方案。 本篇文章將會介紹JWT鑒權和授權的原理、實現(xiàn)方式以及注意事項。 什么是JWT? JWT是一種基于JSON格式的開放標準(RFC7519),用于在網(wǎng)絡

    2023年04月21日
    瀏覽(88)
  • Asp-Net-Core開發(fā)筆記:API版本管理

    Asp-Net-Core開發(fā)筆記:API版本管理

    對于Web API應用程序而言,隨著時間的推移以及需求的增加或改變,API必然會遇到升級的需求。事實上,Web API應用程序應該從創(chuàng)建時就考慮到API版本的問題。業(yè)務的調(diào)整、功能的增加、接口的移除與改名、接口參數(shù)變動、實體屬性的添加、刪除和更改等都會改變API的功能,從

    2024年02月08日
    瀏覽(26)
  • ASP.NET Core MVC 從入門到精通之日志管理

    ASP.NET Core MVC 從入門到精通之日志管理

    隨著技術的發(fā)展,ASP.NET Core MVC也推出了好長時間,經(jīng)過不斷的版本更新迭代,已經(jīng)越來越完善,本系列文章主要講解ASP.NET Core MVC開發(fā)B/S系統(tǒng)過程中所涉及到的相關內(nèi)容,適用于初學者,在校畢業(yè)生,或其他想從事ASP.NET Core MVC 系統(tǒng)開發(fā)的人員。 經(jīng)過前幾篇文章的講解,初步

    2024年02月09日
    瀏覽(22)
  • asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng)

    asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng)

    作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131458964 asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng) ,本文章介紹asp.net core框架搭建,然后開發(fā)一個后臺管理系統(tǒng),將一步步帶著大家,實現(xiàn)目標。所有操作過程將展現(xiàn)在本篇文章,下面咋們一起來實現(xiàn)它吧。 使

    2024年02月12日
    瀏覽(20)
  • 安全機密管理:Asp.Net Core中的本地敏感數(shù)據(jù)保護技巧

    安全機密管理:Asp.Net Core中的本地敏感數(shù)據(jù)保護技巧

    在我們開發(fā)過程中基本上不可或缺的用到一些敏感機密數(shù)據(jù),比如 SQL 服務器的連接串或者是 OAuth2 的 Secret 等,這些敏感數(shù)據(jù)在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數(shù)據(jù),一種推薦的方式是通過 Asp.Net Core 的 機密管理器 。 在 ASP.NET Core 中,機密

    2024年04月25日
    瀏覽(27)
  • ASP.NET Core MVC+Quartz實現(xiàn)定時任務可視化管理頁面

    ASP.NET Core MVC+Quartz實現(xiàn)定時任務可視化管理頁面

    在前一篇文章,我們了解了如何通過.NET6+Quartz開發(fā)基于控制臺應用程序的定時任務,今天繼續(xù)在之前的基礎上,進一步講解基于ASP.NET Core MVC+Quartz實現(xiàn)定時任務的可視化管理頁面,僅供學習分享使用,如有不足之處,還請指正。 Quartz組件,關于Quartz組件的基本介紹,可參考前

    2024年02月01日
    瀏覽(28)
  • ASP.NET Core 中基于 Controller 的 Web API

    ASP.NET Core 中基于 Controller 的 Web API

    客戶端發(fā)送Http請求,Contoller響應請求,并從數(shù)據(jù)庫讀取數(shù)據(jù),序列化數(shù)據(jù),然后通過 Http Response返回序列化的數(shù)據(jù)。 Web API 的所有controllers 一般繼承于 ControllerBase 類,而不是Controller 類。 因為 Controller 類也繼承自ControllerBase 類,但是支持views,而API一般不需要這個功能。 Co

    2024年02月10日
    瀏覽(30)
  • Asp .Net Core 系列:基于 Swashbuckle.AspNetCore 包 集成 Swagger

    Asp .Net Core 系列:基于 Swashbuckle.AspNetCore 包 集成 Swagger

    Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風格的 Web 服務。它提供了一種規(guī)范的方式來定義、構建和文檔化 RESTful Web 服務,使客戶端能夠發(fā)現(xiàn)和理解各種服務的功能。Swagger 的目標是使部署管理和使用功能強大的 API 從未如此簡單。 Swagger 提供了

    2024年01月18日
    瀏覽(26)
  • 一個基于ASP.NET Core完全開源的CMS 解決方案

    一個基于ASP.NET Core完全開源的CMS 解決方案

    MixCore CMS是一個基于.NET Core框架的開源內(nèi)容管理系統(tǒng)(CMS),提供了豐富的的基礎功能和插件,是一款面向未來的企業(yè) Web? CMS ,可輕松構建任何類型的應用程序。集成了Google Analytics分析,以及友好的Seo功能,非常適合用于創(chuàng)建企業(yè)網(wǎng)站、內(nèi)容系統(tǒng)、個人博客,也可以用于開發(fā)

    2024年02月05日
    瀏覽(113)
  • ASP.NET Core 中基于 Minimal APIs 的Web API

    Minimal APIs 是ASP.NET Core中快速構建 REST API 的方式,可以用最少的代碼構建全功能的REST API。比如下面三行代碼: 可以實現(xiàn)在請求網(wǎng)站根目錄結點的時候,返回\\\"Hello World!\\\"。 這種方式的Web API可以用于構建微服務,極簡功能的網(wǎng)站。 下面代碼,將幾個 HTTP 請求的 url映射到 Lambda

    2024年02月10日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包