.net core下訪問控制層的實(shí)現(xiàn)

在上一篇[.net core下對于附件上傳下載的實(shí)現(xiàn)]主要介紹了 .net core下文件上傳下載的相關(guān)操作士葫,本篇主要介紹下對于權(quán)限驗證如何通過自定義的中間件進(jìn)行攔截實(shí)現(xiàn)巩掺。

對于一般的程序而言濒持,如果在未登錄的情況下理應(yīng)是沒有對應(yīng)的權(quán)限訪問對應(yīng)的頁面的茉继,同時谎脯,不同的用戶也需要驗證該用戶權(quán)限是否滿足條件不见。

對于后端服務(wù)來說澳化,就需要有個中間層進(jìn)行攔截,驗證對應(yīng)的http請求是否滿足權(quán)限要求稳吮。

這里我們用到了Middleware-請求管道缎谷,通過自定義中間件的方式來實(shí)現(xiàn)對Http請求的攔截,實(shí)現(xiàn)相關(guān)驗證灶似。

對于Middleware-請求管道的原理和解釋可以參考這篇文章:Middleware-請求管道的構(gòu)成

實(shí)現(xiàn)邏輯

用戶在登錄成功后列林,我們在服務(wù)端會自動生成一個Token,這個Token會綁定對應(yīng)的權(quán)限酪惭,同時保存到Redis中希痴。

我們自定義的中間層會攔截請求,獲取請求中的Token是否合法春感,若不合法會對該請求進(jìn)行攔截砌创。

通過使用UseMiddleware擴(kuò)展方法虏缸,將攔截到的HttpContext進(jìn)行相應(yīng)的邏輯處理。

具體代碼

首先我們自定義一個權(quán)限控制的中間件,SecurityMiddleware類就是我們具體的邏輯實(shí)現(xiàn)嫩实。

public static IApplicationBuilder UseSecurity(this IApplicationBuilder builder)
{
    return builder.UseMiddleware<SecurityMiddleware>();
}

Startup.cs中的Configure方法下寇钉,我們添加我們自定義的中間件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseSwagger();
    app.UseSwaggerUI(c => {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "我的API V1");
    });

    app.UseSecurity();//自定義中間件

    app.UseMvc();
}

接下來我們具體實(shí)現(xiàn)對應(yīng)的SecurityMiddleware類,主要實(shí)現(xiàn)對應(yīng)的Invoke方法

public async Task Invoke(HttpContext context)
{
    string path = context.Request.Path.ToString().ToLower();

    // 判斷請求的路徑是否是排除權(quán)限限制的(如登錄頁舶赔,登錄頁)
    if (excludeUrl.Contains(path))
    {
        await _next(context);
        return;
    }

    // 尋找header中的token
    string userToken = string.Empty;            
    bool hasValue = context.Request.Headers.TryGetValue(INVOKER_TOKEN_HEADER, out StringValues token);
    if (!hasValue || token.Count == 0)
    {
        // 若header沒取到token,則嘗試從cookie中獲取
        userToken = context.Request.Cookies[USER_TOKEN_COOKIE_NAME];
        if(string.IsNullOrWhiteSpace(userToken))
        {
            // TODO: 尚未登錄谦秧,未經(jīng)授權(quán)
            await CreateUnauthorizedResponse(context);

            return;
        }
    }
    else
    {
        userToken = token[0];
    }

    //根據(jù)對應(yīng)的Token到Redis中找對應(yīng)的權(quán)限數(shù)據(jù)竟纳,若沒找到,說明沒有授權(quán)
    var userInfo = await GetUserInfo(userToken);
    if (userInfo == null)
    {
        // TODO: 尚未登錄疚鲤,未經(jīng)授權(quán)
        await CreateUnauthorizedResponse(context);
        return;
    }

    //可繼續(xù)針對請求判斷是否有相對應(yīng)的權(quán)限
}

對應(yīng)構(gòu)造Response方法:

private static async Task CreateUnauthorizedResponse(HttpContext context)
{
    context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    context.Response.ContentType = "application/json;charset=utf-8";

    ResponseResult result = new ResponseResult
    {
        Result = false,
        ErrorMessage = "您需要登錄后訪問此資源锥累,請先進(jìn)行登錄操作。",
        Code = ResponseCode.Unauthorized
    };

    await context.Response.WriteAsync(JsonConvert.SerializeObject(result), Encoding.UTF8);
}

到這里集歇,我們基本上實(shí)現(xiàn)的對應(yīng)的控制訪問桶略。

總結(jié)

對于本篇來說,還是需要去了解下 .net core的運(yùn)行原理诲宇,以便更好的去實(shí)現(xiàn)你想要的方法际歼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姑蓝,隨后出現(xiàn)的幾起案子鹅心,更是在濱河造成了極大的恐慌,老刑警劉巖纺荧,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旭愧,死亡現(xiàn)場離奇詭異,居然都是意外死亡宙暇,警方通過查閱死者的電腦和手機(jī)输枯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來占贫,“玉大人桃熄,你說我怎么就攤上這事“薪#” “怎么了蜻拨?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桩引。 經(jīng)常有香客問我缎讼,道長,這世上最難降的妖魔是什么坑匠? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任血崭,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夹纫。我一直安慰自己咽瓷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布舰讹。 她就那樣靜靜地躺著茅姜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪月匣。 梳的紋絲不亂的頭發(fā)上钻洒,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音锄开,去河邊找鬼素标。 笑死,一個胖子當(dāng)著我的面吹牛萍悴,可吹牛的內(nèi)容都是我干的头遭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼癣诱,長吁一口氣:“原來是場噩夢啊……” “哼计维!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撕予,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤享潜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗅蔬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剑按,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年澜术,在試婚紗的時候發(fā)現(xiàn)自己被綠了艺蝴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸟废,死狀恐怖猜敢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盒延,我是刑警寧澤缩擂,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站添寺,受9級特大地震影響胯盯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜计露,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一博脑、第九天 我趴在偏房一處隱蔽的房頂上張望憎乙。 院中可真熱鬧,春花似錦叉趣、人聲如沸泞边。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阵谚。三九已至,卻和暖如春烟具,著一層夾襖步出監(jiān)牢的瞬間椭蹄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工净赴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罩润。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓玖翅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親割以。 傳聞我的和親對象是個殘疾皇子金度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容