最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法

 更新時(shí)間:2021年07月12日 10:59:49   作者:Jeffcky  
這篇文章主要介紹了.NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

在.NET 5之前,當(dāng)授權(quán)失敗即403時(shí)無法很友好的自定義錯(cuò)誤信息,以致于比如利用Vue獲取到的是空響應(yīng),不能很好的處理實(shí)際業(yè)務(wù),同時(shí)涉及到權(quán)限粒度控制到控制器、Action,也不能很好的獲取對(duì)應(yīng)路由信息。本文我們來看看在.NET 5中為何要出現(xiàn)針對(duì)授權(quán)失敗的中間件接口?它是如何一步步衍生出來的呢?以及對(duì)于授權(quán)失敗根據(jù)實(shí)際需要如何自定義響應(yīng)錯(cuò)誤,以及如何獲取對(duì)應(yīng)路由信息等等

授權(quán)失敗自定義響應(yīng)信息

如下是在.NET 5之前,對(duì)于授權(quán)處理,我們大多實(shí)現(xiàn)自定義的AuthorizationHandler

public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
    {
        throw new NotImplementedException();
    }
}

public class CustomAuthorizationRequirement : IAuthorizationRequirement
{
    public CustomAuthorizationRequirement()
    {
    }
}

但此時(shí)參數(shù)給予的是授權(quán)上下文,我們并不能拿到當(dāng)前請(qǐng)求上下文中的相關(guān)信息,如果是在mvc中,想必大多是如下這般獲取的

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
{
    var context = context.Resource as HttpContext;
}

但對(duì)于前后分離的web api中,若我沒記錯(cuò)的話,這樣是獲取到的是空,于是乎我們借助于注入上下文接口實(shí)現(xiàn),演變成如下這樣

public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{
    private readonly IHttpContextAccessor _accessor;
    public CustomAuthorizeHandler(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }
    protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
    {
        var httpContext = _accessor.HttpContext;

        // 授權(quán)失敗響應(yīng)信息
        await httpContext.Response.WriteAsync("授權(quán)失敗");

        //響應(yīng)失敗調(diào)用
        context.Fail();

    }
}

通過上下文可以拿到比如用戶聲明信息等等,貌似已經(jīng)基本滿足我們實(shí)際業(yè)務(wù)需求,那要是我想獲取路由信息又該如何呢?在3.0以下貌似只能通過Path自己解析(個(gè)人猜測(cè)),從.NET Core 3.0+上,官方開放針對(duì)上下文的擴(kuò)展方法,提供給我們獲取路由節(jié)點(diǎn)元數(shù)據(jù)詳細(xì)信息

在該終結(jié)點(diǎn)類存在一個(gè)元數(shù)據(jù)屬性,該屬性為集合,該元數(shù)據(jù)包含任何你想要的東東

這里必須強(qiáng)調(diào)一下,我最喜愛.NET Core的一點(diǎn)是,很多時(shí)候我們會(huì)封裝類庫(kù),并在類庫(kù)中使用到Web APi中相關(guān)的上下文一切信息等等,如果是以前.NET Framework怕是有點(diǎn)麻煩

比如如上在類庫(kù)中獲取上下文接口,如果你還是延續(xù)舊思想,查看vs智能提示你是否需要安裝包,你會(huì)發(fā)現(xiàn)在Web APi中版本和你安裝的版本是對(duì)應(yīng)不上的,這可能是有問題的哈(具體細(xì)節(jié)我并未深入探究),但實(shí)際上我想安裝的是.NET 5

在.NET Core類庫(kù)中要實(shí)現(xiàn).NET Core相關(guān)基礎(chǔ)框架信息,只需要在類庫(kù)項(xiàng)目文件中引入支持.NET Core應(yīng)用程序包包即可,如此才和當(dāng)前應(yīng)用程序版本完全一致

<ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

面向不同群體讀者,這里還是重點(diǎn)強(qiáng)調(diào)下,以免有些學(xué)習(xí).NET Core的童鞋走偏了!話題扯遠(yuǎn)了,比如如上述我們想要獲取到元數(shù)據(jù)中的控制器和action名稱,該元數(shù)據(jù)集合參數(shù)都是object,所以我們想要對(duì)應(yīng)的信息,需要稍微清楚一點(diǎn).NET Core基本流程處理所提供的各個(gè)對(duì)象

public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{
    private readonly IHttpContextAccessor _accessor;
    public CustomAuthorizeHandler(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }
    protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
    {
        var httpContext = _accessor.HttpContext;

        var endPoint = httpContext.GetEndpoint();

        var controllerActionDescriptor = (ControllerActionDescriptor)endPoint.Metadata
            .ToList().FirstOrDefault(d => d is ControllerActionDescriptor);

        var controllerName = controllerActionDescriptor.ControllerName;

        var actionName = controllerActionDescriptor.ActionName;

    }
}

講到這里,實(shí)現(xiàn)對(duì)應(yīng)抽象授權(quán)處理對(duì)象,基本上可滿足我們的需求,即使上述拿到上下文并響應(yīng),但是在接口響應(yīng)上我們是獲取不到的,因?yàn)槭跈?quán)上下文,只提供Fail和Succeed方法,要是我們想根據(jù)業(yè)務(wù)失敗后直接響應(yīng)呢?所以最大的問題出在:我們無法完全控制響應(yīng),以及自定義響應(yīng)。這個(gè)時(shí)候,經(jīng)過開發(fā)者在github上激烈的反饋,官方在.NET 5給出了,針對(duì)授權(quán)處理的中間件接口,上下文也已直接對(duì)外暴露

public class CustomAuthorizationMiddlewareResultHandler
        : IAuthorizationMiddlewareResultHandler
{

    public async Task HandleAsync(RequestDelegate next,
      HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
    {
        var endPoint = context.GetEndpoint();

        var controllerActionDescriptor = (ControllerActionDescriptor)endPoint.Metadata
          .ToList().FirstOrDefault(d => d is ControllerActionDescriptor);

        var controllerName = controllerActionDescriptor.ControllerName;

        var actionName = controllerActionDescriptor.ActionName;

        if (!context.User.Identity.IsAuthenticated)
        {
            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":401,\"message\":\"登錄已過期,請(qǐng)重新登錄\"}}");
            return;
        }
        else if (!await HandleRequirementEvaluateAsync(context.User, controllerName, actionName))
        {
            context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
            await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":403,\"message\":\"您暫無足夠的權(quán)限執(zhí)行該操作\"}}");
            return;
        }
        await next(context);
    }
}

自從.NET 5有了IAuthorizationMiddlewareResultHandler授權(quán)中間件接口,一切又是那么得心應(yīng)手!

到此這篇關(guān)于.NET Core授權(quán)失敗如何自定義響應(yīng)信息的文章就介紹到這了,更多相關(guān).NET Core自定義響應(yīng)信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • asp.net 用XML生成放便擴(kuò)展的自定義樹

    asp.net 用XML生成放便擴(kuò)展的自定義樹

    快過年了,公司沒有多少工作。閑來無事,共享一下之前為WEB系統(tǒng)所做的放便擴(kuò)展的自定義樹。
    2010-02-02
  • ASP.NET同步分頁(yè)MvcPager使用詳解

    ASP.NET同步分頁(yè)MvcPager使用詳解

    這篇文章主要為大家詳細(xì)介紹了ASP.NET同步分頁(yè)MvcPager的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • ASP.Net頁(yè)尾中添加JavaScript的最佳方法實(shí)戰(zhàn)分享

    ASP.Net頁(yè)尾中添加JavaScript的最佳方法實(shí)戰(zhàn)分享

    將JavaScript腳本或庫(kù)添加到asp.net頁(yè)的末尾方法有很多,究竟哪一個(gè)最好使呢有利于日后的維護(hù)啊,是個(gè)疑點(diǎn)啊,本文的出現(xiàn)將幫你解決所有的困惑,感興趣的你可不要錯(cuò)過了哈
    2013-02-02
  • WPF實(shí)現(xiàn)文本描邊+外發(fā)光效果的示例代碼

    WPF實(shí)現(xiàn)文本描邊+外發(fā)光效果的示例代碼

    這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)文本描邊以及外發(fā)光的效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-03-03
  • 淺談ASP.NET的Postback 實(shí)例代碼

    淺談ASP.NET的Postback 實(shí)例代碼

    說道ASP.NET的Postback,就得說Web Page的生命周期,但是Web Page的生命周期卻不是三言兩語(yǔ)就能夠說得清楚的,所以在這里單純站的編程的角度,撇開Web Page 的生命周期淺談Postback。
    2009-08-08
  • ASP.NET MVC自定義授權(quán)過濾器

    ASP.NET MVC自定義授權(quán)過濾器

    這篇文章介紹了ASP.NET MVC自定義授權(quán)過濾器的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • asp.net通過js實(shí)現(xiàn)Cookie創(chuàng)建以及清除Cookie數(shù)組的代碼

    asp.net通過js實(shí)現(xiàn)Cookie創(chuàng)建以及清除Cookie數(shù)組的代碼

    asp.net Cookie創(chuàng)建以及清除Cookie數(shù)組
    2010-03-03
  • ASP.NET?Core?6.0對(duì)熱重載的支持實(shí)例詳解

    ASP.NET?Core?6.0對(duì)熱重載的支持實(shí)例詳解

    .NET 熱重載會(huì)將代碼更改(包括對(duì)樣式表的更改)應(yīng)用到正在運(yùn)行的應(yīng)用,而無需重啟應(yīng)用,也不會(huì)丟失應(yīng)用狀態(tài),下面這篇文章主要給大家介紹了關(guān)于ASP.NET?Core?6.0對(duì)熱重載支持的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • DotNetCore深入了解之HttpClientFactory類詳解

    DotNetCore深入了解之HttpClientFactory類詳解

    這篇文章主要給大家介紹了關(guān)于DotNetCore深入了解之HttpClientFactory類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • asp.net類序列化生成xml文件實(shí)例詳解

    asp.net類序列化生成xml文件實(shí)例詳解

    這篇文章主要介紹了asp.net類序列化生成xml文件的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了asp.net序列化生成xml文件的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

咸丰县| 平定县| 桑日县| 秦皇岛市| 珠海市| 阿荣旗| 瑞昌市| 庆阳市| 兴和县| 赤水市| 旬邑县| 文昌市| 钦州市| 舞钢市| 长兴县| 关岭| 通江县| 忻城县| 阿克陶县| 普定县| 西丰县| 孟连| 安丘市| 盘锦市| 潮安县| 金湖县| 涪陵区| 南涧| 和田市| 沙坪坝区| 伽师县| 江城| 左贡县| 慈溪市| 蓬溪县| 桂东县| 迭部县| 隆昌县| 渭南市| 石家庄市| 临沂市|