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

ASP.NET Core 鑒權(quán)授權(quán)三(添加自定義授權(quán)策略)

這篇具有很好參考價(jià)值的文章主要介紹了ASP.NET Core 鑒權(quán)授權(quán)三(添加自定義授權(quán)策略)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Program.cs

#region 授權(quán)
builder.Services.AddAuthorization(option =>
{
    //添加自定義授權(quán)策略
    option.AddPolicy("MyPolicy",p => p.RequireClaim(ClaimTypes.NameIdentifier,"1"));
});
#endregion

TestController.cs 應(yīng)用自定義授權(quán)策略

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [Authorize("MyPolicy")]
    [HttpGet]
    public async Task<string> Get()
    {
        return await Task.FromResult(DateTime.Now.ToString());
    }
}

TokenAuthenticationHandler.cs

    public Task<AuthenticateResult> AuthenticateAsync()
    {
        string token = _context.Request.Headers["Authorization"];
        if (token == "test")
        {
            ClaimsIdentity identity = new ClaimsIdentity("Ctm");
            identity.AddClaims(new List<Claim>(){
                new Claim(ClaimTypes.Name,"admin"),
                new Claim(ClaimTypes.NameIdentifier,"6")
            });
            var claimsPrincipal = new ClaimsPrincipal(identity);
            return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, null, _scheme.Name)));
        }
        return Task.FromResult(AuthenticateResult.Fail("token錯(cuò)誤,請(qǐng)重新登錄"));
    }
    /// <summary>
    /// 沒(méi)有權(quán)限訪問(wèn)
    /// </summary>
    /// <param name="properties"></param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task ForbidAsync(AuthenticationProperties? properties)
    {
        _context.Response.StatusCode = 403;
        return Task.CompletedTask;
    }

此處鑒權(quán)給的值是6,授權(quán)用的1,嘗試訪問(wèn)
ASP.NET Core 鑒權(quán)授權(quán)三(添加自定義授權(quán)策略)

重要概念

基于策略的授權(quán)中有一個(gè)很重要的概念是Requirements,每一個(gè)Requirement都代表一個(gè)授權(quán)條件。
Requirement需要繼承接口IAuthorizationRequirement。

已經(jīng)內(nèi)置了一些常用的實(shí)現(xiàn):
AssertionRequirement :使用最原始的斷言形式來(lái)聲明授權(quán)策略。

DenyAnonymousAuthorizationRequirement :用于表示禁止匿名用戶訪問(wèn)的授權(quán)策略,并在AuthorizationOptions中將其設(shè)置為默認(rèn)策略。

ClaimsAuthorizationRequirement :用于表示判斷Cliams中是否包含預(yù)期的Claims的授權(quán)策略。

RolesAuthorizationRequirement :用于表示使用ClaimsPrincipal.IsInRole來(lái)判斷是否包含預(yù)期的Role的授權(quán)策略。

NameAuthorizationRequirement:用于表示使用ClaimsPrincipal.Identities.Name來(lái)判斷是否包含預(yù)期的Name的授權(quán)策略。

OperationAuthorizationRequirement:用于表示基于操作的授權(quán)策略。

當(dāng)內(nèi)置的Requirement不能滿足需求時(shí),可以定義自己的Requirement.

自定義Requirement

builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p => p.Requirements.Add(new MyAuthorizationHandler("1")));
});

MyAuthorizationHandler.cs

public class MyAuthorizationHandler : AuthorizationHandler<MyAuthorizationHandler>, IAuthorizationRequirement
{
    private readonly string _userId;
    public MyAuthorizationHandler(string userId)
    {
        _userId = userId;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyAuthorizationHandler requirement)
    {
        if (context.User.HasClaim(c => c.Type == ClaimTypes.NameIdentifier)
        && context.User.Claims.FirstOrDefault(c => c.Type.Equals(ClaimTypes.NameIdentifier)).Value == _userId)
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }
        return Task.CompletedTask;
    }
}

多授權(quán)方案

builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p => p.Requirements.Add(new MyAuthorizationHandler("1")));
    option.AddPolicy("MyPolicy1", p => p.Requirements.Add(new MyAuthorizationHandler1("admin")));
});

MyAuthorizationHandler1.cs

public class MyAuthorizationHandler1 : AuthorizationHandler<MyAuthorizationHandler1>, IAuthorizationRequirement
{
    private readonly string _userName;
    public MyAuthorizationHandler1(string userName)
    {
        _userName = userName;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyAuthorizationHandler1 requirement)
    {
        if (context.User.HasClaim(c => c.Type == ClaimTypes.Name)
        && context.User.Claims.FirstOrDefault(c => c.Type.Equals(ClaimTypes.Name)).Value == _userName)
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }
        return Task.CompletedTask;
    }
}

TestController.cs

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [Authorize(Policy = "MyPolicy")]
    [Authorize(Policy = "MyPolicy1")]
    [HttpGet]
    public async Task<string> Get()
    {
        return await Task.FromResult(DateTime.Now.ToString());
    }
}

鑒權(quán)方案 TokenAuthenticationHandler.cs

public class TokenAuthenticationHandler : IAuthenticationHandler
{
    private AuthenticationScheme _scheme;
    private HttpContext _context;
    /// <summary>
    /// 鑒權(quán)初始化
    /// </summary>
    /// <param name="scheme">鑒權(quán)架構(gòu)名稱</param>
    /// <param name="context">HttpContext</param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
    {
        _scheme = scheme;
        _context = context;
        return Task.CompletedTask;
    }
    public Task<AuthenticateResult> AuthenticateAsync()
    {
        string token = _context.Request.Headers["Authorization"];
        if (token == "test")
        {
            ClaimsIdentity identity = new ClaimsIdentity("Ctm");
            identity.AddClaims(new List<Claim>(){
                new Claim(ClaimTypes.Name,"admin"),
                new Claim(ClaimTypes.NameIdentifier,"1")
            });
            var claimsPrincipal = new ClaimsPrincipal(identity);
            return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, null, _scheme.Name)));
        }
        return Task.FromResult(AuthenticateResult.Fail("token錯(cuò)誤,請(qǐng)重新登錄"));
    }

    /// <summary>
    /// 未登錄
    /// </summary>
    /// <param name="properties"></param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task ChallengeAsync(AuthenticationProperties? properties)
    {
        _context.Response.Redirect("/api/Login/NoLogin");
        return Task.CompletedTask;
    }

    /// <summary>
    /// 沒(méi)有權(quán)限訪問(wèn)
    /// </summary>
    /// <param name="properties"></param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task ForbidAsync(AuthenticationProperties? properties)
    {
        _context.Response.StatusCode = 403;
        return Task.CompletedTask;
    }
}

多授權(quán)方案,每個(gè)授權(quán)策略都需要通過(guò)
那么也可以使用多鑒權(quán)架構(gòu),Cookie可用于web瀏覽器,token用于終端API調(diào)用

改造效果:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-772384.html

多鑒權(quán)方案

Program.cs

//注冊(cè)鑒權(quán)架構(gòu)
#region Cookie
builder.Services.AddAuthentication("Cookies").AddCookie(o =>{
    o.LoginPath = "/api/Login/NoLogin";
});

#region  自定義Token驗(yàn)證
builder.Services.AddAuthentication(option =>
{
    //把自定義的鑒權(quán)方案添加到鑒權(quán)架構(gòu)中
    option.AddScheme<TokenAuthenticationHandler>("token", "myToken");
    option.DefaultAuthenticateScheme = "token";
    option.DefaultChallengeScheme = "token";
    option.DefaultForbidScheme = "token";
});
#endregion
#endregion


#region 授權(quán)
// builder.Services.AddAuthorization(option =>
// {
//     option.AddPolicy("MyPolicy",p => p.RequireClaim(ClaimTypes.NameIdentifier,"1"));
// });

builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p => p.Requirements.Add(new MyAuthorizationHandler("1")));
    // option.AddPolicy("MyPolicy1", p => p.Requirements.Add(new MyAuthorizationHandler1("admin")));
});
#endregion

TestController.cs

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [Authorize(Policy = "MyPolicy",AuthenticationSchemes = $"token,Cookies")]
    [HttpGet]
    public async Task<string> Get()
    {
        return await Task.FromResult(DateTime.Now.ToString());
    }
}

授權(quán)綁定鑒權(quán)

//注冊(cè)鑒權(quán)架構(gòu)
#region Cookie
builder.Services.AddAuthentication("Cookies").AddCookie(o =>{
    o.LoginPath = "/api/Login/NoLogin";
});

#region  自定義Token驗(yàn)證
builder.Services.AddAuthentication(option =>
{
    //把自定義的鑒權(quán)方案添加到鑒權(quán)架構(gòu)中
    option.AddScheme<TokenAuthenticationHandler>("token", "myToken");
    //option.DefaultAuthenticateScheme = "token";
    option.DefaultChallengeScheme = "token";
    option.DefaultForbidScheme = "token";
});
#endregion
#endregion
builder.Services.AddAuthorization(option =>
{
    option.AddPolicy("MyPolicy",p =>p.AddAuthenticationSchemes("token").Requirements.Add(new MyAuthorizationHandler("1")));
    option.AddPolicy("MyPolicy1", p =>p.AddAuthenticationSchemes("Cookies").Requirements.Add(new MyAuthorizationHandler1("admin")));
});

到了這里,關(guān)于ASP.NET Core 鑒權(quán)授權(quán)三(添加自定義授權(quán)策略)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ASP.NET Core 授權(quán)二(自定義token)

    首先自定義一個(gè)類TokenAuthenticationHandler,然后需要繼承IAuthenticationHandler接口 具體代碼: 后續(xù)需要鑒權(quán)的接口,在請(qǐng)求上都需要加上Authorization參數(shù) Claim:相當(dāng)于一個(gè)身份單元,存儲(chǔ)著鍵值信息 ClaimsIdentity:身份證,身份單元的集合(可以理解為身份證上有多個(gè)身份單元) Clai

    2024年02月03日
    瀏覽(24)
  • .Net Core Jwt鑒權(quán)授權(quán)

    目錄 簡(jiǎn)介 基于.Net Core 驗(yàn)證方式 Jwt獲取Token 引入三方包 生成Token UserInfo JwtConfig WebApi測(cè)試(獲取Token) Program.cs appsetting.json Controller .Net Core 驗(yàn)證(webApi) Progarm.cs Contorller .Net Core 授權(quán) 簡(jiǎn)介 Program.cs JwtAuthorization.cs 注意 Autofac 注冊(cè)授權(quán)服務(wù) Controller 注意 jwt觸發(fā)委托 Jwt分為三段 通過(guò)遠(yuǎn)

    2024年02月13日
    瀏覽(53)
  • ASP.NET CORE WEBAPI 登錄 JWT 鑒權(quán) ,接口權(quán)限驗(yàn)證

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

    2023年04月21日
    瀏覽(84)
  • ASP.NET Core 授權(quán)一(簡(jiǎn)單的Cookie)

    簡(jiǎn)單的理解:鑒權(quán)衡量你能不能進(jìn)一道門,授權(quán)是你進(jìn)門了可以干什么

    2024年02月04日
    瀏覽(24)
  • ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應(yīng)用

    ASP.NET Core MVC -- 將視圖添加到 ASP.NET Core MVC 應(yīng)用

    右鍵單擊“視圖”文件夾,然后單擊“添加”“新文件夾”,并將文件夾命名為“HelloWorld”。 右鍵單擊“Views/HelloWorld”文件夾,然后單擊“添加”“新項(xiàng)”。 在“添加新項(xiàng) - MvcMovie”對(duì)話框中: 在右上角的搜索框中,輸入“視圖” 選擇“Razor 視圖 - 空” 保持“名稱”框的

    2024年02月13日
    瀏覽(125)
  • Asp.Net Core 6 Cookie 的身份驗(yàn)證策略

    Asp.Net Core 6 Cookie 的身份驗(yàn)證策略

    參考文獻(xiàn): http://www.js-code.com/xindejiqiao/xindejiqiao_274882.html https://www.cnblogs.com/xiaoxiaotank/p/15811749.html 編寫代碼過(guò)程中不理解的代碼可參考上面的文獻(xiàn) 首先需要配置你的Program.cs,代碼如下: 然后開(kāi)啟中間件 ?創(chuàng)建一個(gè)AuthenticationMiddleware.cs類 在寫登錄的地方去使用 ?最后給你的控制

    2024年02月16日
    瀏覽(29)
  • C# ASP.NET Core Web API 身份授權(quán)(JWT)驗(yàn)證(一)

    C# ASP.NET Core Web API 身份授權(quán)(JWT)驗(yàn)證(一)

    1.開(kāi)發(fā)環(huán)境 VS2022,安裝時(shí)記得勾選ASP.NET有關(guān)的都選上,建議全選,省的麻煩。 ???????? 2.創(chuàng)建初始工程 TestApi (你自己的工程名稱)。 ? ?這就創(chuàng)建工程成功了,按 F5 則可以進(jìn)行調(diào)試了。 而在項(xiàng)目中,我們不僅僅會(huì)用到基礎(chǔ)的api功能,我們一般還會(huì)用到? 身份授權(quán)(J

    2024年02月02日
    瀏覽(28)
  • ASP.NET Core高級(jí)之認(rèn)證與授權(quán)(二)--JWT認(rèn)證前后端完整實(shí)現(xiàn)

    ASP.NET Core高級(jí)之認(rèn)證與授權(quán)(二)--JWT認(rèn)證前后端完整實(shí)現(xiàn)

    了解JWT身份認(rèn)證的流程 了解基于JWT身份認(rèn)證和Session身份認(rèn)證的區(qū)別 學(xué)習(xí)如何在ASP.NET Core WebAPI項(xiàng)目中封裝JWT認(rèn)證功能 在上文ASP.NET Core高級(jí)之認(rèn)證與授權(quán)(一)–JWT入門-頒發(fā)、驗(yàn)證令牌中演示了JWT認(rèn)證的一個(gè)入門案例,本文是一個(gè)基于JWT認(rèn)證的完整的前后端實(shí)現(xiàn)代碼案例。 JWT身

    2024年02月01日
    瀏覽(22)
  • ASP.NET Core Web API下基于Keycloak的多租戶用戶授權(quán)的實(shí)現(xiàn)

    ASP.NET Core Web API下基于Keycloak的多租戶用戶授權(quán)的實(shí)現(xiàn)

    在上文《Keycloak中授權(quán)的實(shí)現(xiàn)》中,以一個(gè)實(shí)際案例介紹了Keycloak中用戶授權(quán)的設(shè)置方法。現(xiàn)在回顧一下這個(gè)案例: 服務(wù)供應(yīng)商(Service Provider)發(fā)布/WeatherForecast API供外部訪問(wèn) 在企業(yè)應(yīng)用(Client)里有三個(gè)用戶:super,daxnet,nobody 在企業(yè)應(yīng)用里有兩個(gè)用戶組:administrators,u

    2024年04月22日
    瀏覽(37)
  • 【asp.net core】自定義模型綁定及其驗(yàn)證

    水此篇博客,依舊是來(lái)自群里的討論,最后說(shuō)到了,在方法參數(shù)自定義了一個(gè)特性,用來(lái)綁定模型,優(yōu)先從Form取,如果為空,或者不存在,在從QueryString中獲取并且綁定,然后閑著無(wú)聊,就水一篇博客,如果大家有什么需求或者問(wèn)題,可以找我,很高興能為你們帶來(lái)幫助。

    2024年02月03日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包