粗略使用.NetCore2.0自帶授權登陸Authorize

来源:http://www.cnblogs.com/wangrudong003/archive/2017/09/03/7469292.html
-Advertisement-
Play Games

上篇有朋友提及到如果nginx做集群後應該還會有下一篇文章主講session控制,一般來說就是登陸;本篇分享的內容不是關於分散式session內容,而是netcore自帶的授權Authorize,Authorize粗略的用法,希望能對大家有好的幫助; web網站session和cookie關係 在N ...


上篇有朋友提及到如果nginx做集群後應該還會有下一篇文章主講session控制,一般來說就是登陸;本篇分享的內容不是關於分散式session內容,而是netcore自帶的授權Authorize,Authorize粗略的用法,希望能對大家有好的幫助;

  • web網站session和cookie關係
  • 在NetCore中使用Authorize登陸

web網站session和cookie關係

要說session和cookie關係,恐怕有很多文章都有說過,這裡我只闡述下自己的理解,儘可能的做到通俗易懂;對於session往往存儲於服務端,登陸的話session一般會存儲登陸用戶的基本信息,還有個會話唯一sessionId(以下簡稱:token),這個token會分配到每個用戶頭上,服務端根據用戶請求的token來識別服務端存儲的登陸信息,以此達到登陸的目的;

客戶端要傳遞這個同樣的token,必須要存儲起來,這就要用到咋們說的cookie,客戶端用cookie來存儲token,cookie擁有過期時間特性能夠很好的做到登錄失效的效果(儘管session也有),往往在分散式的時候cookie和session的失效時間都會設置,只要某一個時間過期了將視為需要重新登錄或者需要重新設置cookie;下麵將截圖在谷歌瀏覽器下某個網站的cookie存儲圖:

能夠看出cookie存儲就是key-value的方式,唯一的名字+value;

在.NetCore中使用Authorize登陸

對於Authorize經常使用mvc的朋友肯定不陌生,在core中使用Authorize登錄首先需要在Starup.cs的ConfigureServices方法中配置下,這裡我直接給出粗略的配置吧(滿足登錄):

 1  public void ConfigureServices(IServiceCollection services)
 2         {
 3             services.AddMvc();
 4 
 5             //配置authorrize
 6             services.AddAuthentication(b =>
 7             {
 8                 b.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
 9                 b.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
10                 b.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
11             }).
12             AddCookie(b =>
13             {
14                 //登陸地址
15                 b.LoginPath = "/login";
16                 //sid
17                 b.Cookie.Name = "My_SessionId";
18                 // b.Cookie.Domain = "shenniu.core.com";
19                 b.Cookie.Path = "/";
20                 b.Cookie.HttpOnly = true;
21                 b.Cookie.Expiration = new TimeSpan(0, 0, 30);
22 
23                 b.ExpireTimeSpan = new TimeSpan(0, 0, 30);
24             });
25         }
下麵簡單說明下cookie的屬性效果:
  • b.Cookie.Name:就是cookie的名字,對應第一小節谷歌瀏覽器截圖的Name;
  • b.LoginPath:設置登陸失敗或者未登錄授權的情況下,直接跳轉的路徑這裡,這是/login;
  • b.Cookie.Domain:指定cookie對應的功能變數名稱,這裡我沒功能變數名稱和沒設置本地host所以屏蔽,屏蔽的或預設localhost;
  • b.Cookie.HttpOnly:設置cookie只讀情況;
  • b.Cookie.Expiration:cookie過期時間;

好了咋們設置完後,需要在login頁面設置這樣的邏輯和代碼;首先是get路由,她會做兩件事情:驗證是否已授權登陸過和未登錄顯示登錄試圖界面:

public IActionResult OnGet()
{
    //登錄授權直接跳轉index界面
    if (HttpContext.User.Identity.IsAuthenticated)
    {
         return RedirectToPage("Index");
    }
    return Page();
}

這裡利用Identity.IsAuthenticated來校驗登錄狀態,登錄了直接重定向到主頁面Index這沒什麼說的;如果沒登錄,需要用戶登陸下,然後在做授權,以下是用戶post提交的登錄請求處理:

/// <summary>
        /// 登錄
        /// </summary>
        /// <returns></returns>
        public async Task<IActionResult> OnPost()
        {

            if (ModelState.IsValid)
            {
                //登陸授權
                var claims = new List<Claim>();
                claims.Add(new Claim(ClaimTypes.Name, this.LoginUser.UserName));
                var indentity = new ClaimsIdentity(claims, "denglu");
                var principal = new ClaimsPrincipal(indentity);
                await HttpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    principal);

                //驗證是否授權成功
                if (principal.Identity.IsAuthenticated)
                {
                    return RedirectToPage("Index");
                }
            }
            return Page();
        }

主要通過HttpContext.SignInAsync()來設置授權,Claim設置一些賬號等信息;這裡我用的是2.0出的Razor模板,也為了更好的學習razor的請求和綁定數據方式,因此這裡給出具體的cshtml代碼佈局代碼:

@page
@model LoginModel
@{
}
<form method="post">
    <input type="text" name="LoginUser.UserName" />
    <button type="submit" class="btn">登陸</button>
</form>

需要註意的是輸入框的那麼這樣寫的 name="LoginUser.UserName" ,對應的cs後臺代碼必須要這樣設置實體:

[BindProperty]
public MoLoginUser LoginUser { get; set; }

需要設置 [BindProperty] 標記,不然沒有初始化LoginUser對象會有問題的(本章也不打算講解更多的razor模板提交的方式,等以後有需要在說吧);

回來說authorize,通過上面配置和登錄的設置,我們還需要通過 [Authorize] 標記哪些界面或者操作需要授權登陸才能執行,比如我這裡的Index界面需要登錄後才能顯示內容,所以只需要在class上添加標記 [Authorize] 就行了:

有了登陸,咋們還需要退出,直接給出退出的具體代碼:

/// <summary>
/// 退出
/// </summary>
/// <returns></returns>
public async Task<IActionResult> OnGetLoginOutAsync()
{
            if (HttpContext.User.Identity.IsAuthenticated)
            {
                await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            }
            return RedirectToPage("Login");
}

實際也僅僅只需要 HttpContext.SignOutAsync 就完成了註銷,這就是Authorize提供的便利;由於這裡還是razor模板,因此在多get提交註銷的時候,如果您自定義了非OnGet或OnGetAsnyc方法名外的get函數,如: public async Task<IActionResult> OnGetLoginOutAsync() ,那麼需要指定get的handler請求參數:hanlder=LoginOut,舉個退出按鈕的例子,這裡的href指定的請求格式如: /login?handler=loginout ,這樣才能請求的login界面的退出 OnGetLoginOutAsync 方法,好吧下麵看下效果圖:

如果本文對您有好的幫助,不妨點個贊支持下,謝謝!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 其實關於這方面的知識,我閱讀的是《UNIX網路編程:捲一》,書里是以UNIX為中心展開描述的,根據這部分知識,在網上參考了部分資料。以Linux為中心整理了這篇博客。 Linux的I/O模型 和Unix的I/O模型基本一致,Linux下一共有5種I/O模型[1] 阻塞式I/O模型; 非阻塞式I/O模 ...
  • 本文是經驗帖,以後遇到類似的情況會持續更新到這篇文章 普通用戶使用sudo會遇到一下情況 1.無法寫入 /var/log/messages /var/log/secure 2.無法使用字元重定向在 /etc/security/limit.d 目錄下新建文件 3.無法將字元流重定向到 /etc/gru ...
  • SELinux是美國國家安全局(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。但是SELinux的並不能與眾多服務很好的相容,有些人會關閉SELinux一了百了。在日常的運維過程中很少去頻繁的開啟關閉SElinux,今天我就寫一個關閉與開啟SELinux的腳本來鍛煉我的腳 ...
  • 話不多說, 直接上教程. 首先備份/etc/yum.repos.d/CentOS Base.repo 下載對應版本repo文件, 放入/etc/yum.repos.d/(操作前請做好相應備份) 運行以下命令生成緩存 參考: "CentOS鏡像使用幫助" ...
  • 用apt-get安裝軟體時提示: 無法獲得鎖 /var/lib/dpkg/lock - open(11:資源暫時不可用) 無法鎖定管理目錄(/var/lib/dpkg/),是否有其他進程正占用它? 其實報錯已經給了提示了,就是有進程正在占用apt-get命令,So... 命令跑起來,找出這個進程,k ...
  • 一、OpenTSDB簡介 開源監控系統OpenTSDB,用hbase存儲所有的時序(無須 採樣)來構建一個分散式、可伸縮的時間序列資料庫。它支持秒級數據採集所有metrics,支持永久存儲,可以做容量規劃,並很容易的接入到現有的報警系 統里。OpenTSDB可以從大規模的集群(包括集群中的網路設備、 ...
  • linux打包壓縮和解壓縮命令大全 linux壓縮和解壓縮命令大全 tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName. ...
  • 在伺服器端 Web 應用程式框架中,其中非常重要的設計是開發人員如何將URL與伺服器上的資源進行匹配,以便正確的處理請求。最簡單的方法是將 URL 映射到磁碟上的物理文件,在 Razor 頁面框架中,ASP.NET團隊就是這樣實現的。 關於 Razor 頁面框架如何將 URL 與文件相匹配,有一些規 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...