asp.net core2.2 多用戶驗證和授權

来源:https://www.cnblogs.com/catzhou/archive/2019/01/09/10243069.html
-Advertisement-
Play Games

asp.net core2.2 "用戶驗證" 和 "授權" 有很詳細和特貼心的介紹,我感興趣的主要是這兩篇: 1. "cookie身份驗證" 2. "基於角色的授權" 我的項目有兩類用戶: 1. 微信公眾號用戶,用戶名為公眾號的openid 2. 企業微信的用戶,用戶名為企業微信的userid 每類 ...


asp.net core2.2 用戶驗證授權有很詳細和特貼心的介紹,我感興趣的主要是這兩篇:

  1. cookie身份驗證
  2. 基於角色的授權

我的項目有兩類用戶:

  1. 微信公眾號用戶,用戶名為公眾號的openid
  2. 企業微信的用戶,用戶名為企業微信的userid

每類用戶中部分人員具有“Admin”角色

因為企業微信的用戶有可能同時是微信公眾號用戶,即一個人兩個名,所以需要多用戶驗證和授權。咱用代碼說話最簡潔,如下所示:

public class DemoController : Controller
{
    /// <summary>
    /// 企業微信用戶使用的模塊
    /// </summary>
    /// <returns></returns>
    public IActionResult Work()
    {
        return Content(User.Identity.Name +User.IsInRole("Admin"));
    }
    /// <summary>
    /// 企業微信管理員使用的模塊
    /// </summary>
    /// <returns></returns>
    public IActionResult WorkAdmin()
    {
        return Content(User.Identity.Name + User.IsInRole("Admin"));
    }
    /// <summary>
    /// 微信公眾號用戶使用的模塊
    /// </summary>
    /// <returns></returns>
    public IActionResult Mp()
    {
        return Content(User.Identity.Name + User.IsInRole("Admin"));
    }
    /// <summary>
    /// 微信公眾號管理員使用的模塊
    /// </summary>
    /// <returns></returns>
    public IActionResult MpAdmin()
    {
        return Content(User.Identity.Name + User.IsInRole("Admin"));
    }
}

下麵咱一步一步實現。

第一步 改造類Startup

  1. 修改ConfigureServices方法,加入以下代碼

         services.AddAuthentication
             (
             "Work"  //就是設置一個預設的cookie驗證的名字,預設的意思就是需要寫的時候可以不寫。另外很多時候用CookieAuthenticationDefaults.AuthenticationScheme,這玩意就是字元串常量“Cookies”,
             )
             .AddCookie
             (
             "Work", //cookie驗證的名字,“Work”可以省略,因為是預設名
             option =>
             {
                 option.LoginPath = new PathString("/Demo/WorkLogin"); //設置驗證的路徑
                 option.AccessDeniedPath= new PathString("/Demo/WorkDenied");//設置無授權訪問跳轉的路徑
             }).AddCookie("Mp", option =>
             {
                 option.LoginPath = new PathString("/Demo/MpLogin");
                 option.AccessDeniedPath = new PathString("/Demo/MpDenied");
             });
  2. 修改Configure方法,加入以下代碼

         app.UseAuthentication();

第二步 添加驗證

    public async Task WorkLogin(string returnUrl)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, "UserId"),
            new Claim(ClaimTypes.Role, "Admin") //如果是管理員
        };

        var claimsIdentity = new ClaimsIdentity(claims, "Work");//“,"Work"”可以省略,因為是預設名

        var authProperties = new AuthenticationProperties
        {
            AllowRefresh = true,
            //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10), 
            // The time at which the authentication ticket expires. A 
            // value set here overrides the ExpireTimeSpan option of 
            // CookieAuthenticationOptions set with AddCookie.
            IsPersistent = false, //持久化保存,到底什麼意思我也不太清楚,哪位兄弟清楚的話,盼解釋
            //IssuedUtc = <DateTimeOffset>,
            // The time at which the authentication ticket was issued.
            RedirectUri = returnUrl ?? "/Demo/Work"
        };

        await HttpContext.SignInAsync("Work", new ClaimsPrincipal(claimsIdentity), authProperties);
    }
    public IActionResult WorkDenied()
    {
        return Forbid();
    }


    public async Task MpLogin(string returnUrl)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, "OpenId"),
            new Claim(ClaimTypes.Role, "Admin") //如果是管理員
        };

        var claimsIdentity = new ClaimsIdentity(claims, "Mp");//“,"Mp"”不能省略,因為不是預設名

        var authProperties = new AuthenticationProperties
        {
            AllowRefresh = true,
            IsPersistent = false,
            RedirectUri = returnUrl ?? "/Demo/Mp"
        };

        await HttpContext.SignInAsync("Mp", new ClaimsPrincipal(claimsIdentity), authProperties);
    }
    public IActionResult MpDenied()
    {
        return Forbid();
    }

第三步 添加授權

就是在對應的Action前面加[Authorize]

    /// <summary>
    /// 企業微信用戶使用的模塊
    /// </summary>
    /// <returns></returns>
    [Authorize(
        AuthenticationSchemes ="Work" //預設名可以省略
        )]
    public IActionResult Work()
    {
        return Content(User.Identity.Name + User.IsInRole("Admin"));
    }
    /// <summary>
    /// 企業微信管理員使用的模塊
    /// </summary>
    /// <returns></returns>
    [Authorize(AuthenticationSchemes ="Work",Roles ="Admin")]
    public IActionResult WorkAdmin()
    {
        return Content(User.Identity.Name + User.IsInRole("Admin"));
    }
    /// <summary>
    /// 微信公眾號用戶使用的模塊
    /// </summary>
    /// <returns></returns>
    [Authorize(AuthenticationSchemes ="Mp")]
    public IActionResult Mp()
    {
        return Content(User.Identity.Name + User.IsInRole("Admin"));
    }
    /// <summary>
    /// 微信公眾號管理員使用的模塊
    /// </summary>
    /// <returns></returns>
    [Authorize(AuthenticationSchemes ="Mp",Roles ="Admin")]
    public IActionResult MpAdmin()
    {
        return Content(User.Identity.Name + User.IsInRole("Admin"));
    }

Ctrl+F5運行,截屏如下:

最後,講講碰到的坑和求助


一開始的驗證的代碼如下:

    public async Task<IActionResult> Login(string returnUrl)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, "UserId"),
            new Claim(ClaimTypes.Role, "Admin") //如果是管理員
        };

        var claimsIdentity = new ClaimsIdentity(claims, "Work");//“,"Work"”可以省略,因為是預設名

        var authProperties = new AuthenticationProperties
        {
            //AllowRefresh = true,
            //IsPersistent = false,
            //RedirectUri 
        };

        await HttpContext.SignInAsync("Work", new ClaimsPrincipal(claimsIdentity), authProperties);

        return Content("OK");
    }
  1. 返回類型為Task<IActionResult> ,因為懶得寫View,順手寫了句return Content("OK");
  2. 從網站複製過來代碼,AuthenticationProperties沒有設置任何內容

運行起來以後不停的調用login,百度了半天,改了各種代碼,最後把return Content("OK");改成return RedirectToAction("Index");一切OK!

揣摩原因可能是當 return Content("OK");時,自動調用AuthenticationPropertiesRedirectUri,而RedirectUri為空時,自動調用自己。也不知道對不對。

這時候重視起RedirectUri,本來就要返回到returnUrl,是不是給RedirectUri賦值returnUrl就能自動跳轉?

確實,return Content("OK");時候自動跳轉了,return RedirectToAction("Index");無效。

最後把Task<IActionResult> 改成Task ,把return ...刪除,一切完美!(弱弱問一句,是不是原來就應該這樣寫?我一直在走彎路?)

求助

User有屬性Identities,看起來可以有多個Identity,如何有?


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

-Advertisement-
Play Games
更多相關文章
  • 1.Convert類型轉換 總結: 類型如果相相容的兩個變數,可以使用自動類型轉換或者強制類型轉換。 但是,如果兩個類型的變數不相容,比如string與int或者string 與double, 這個時候我們可以使用一個叫做Convert的轉換工廠進行轉換。 註意:使用Convert進行類型轉換,也需 ...
  • 清晨起床,震驚了,窗外一片雪白,大雪紛飛,我承認我詞窮了,說再多話也描述不了此刻的大好心情。所以,話不多說,先上一張朋友圈的圖吧! 趁著這麼“好的”天氣以及這麼好的心情突然想寫點東西記錄一下自己的2018這一年以及2019年的這一天以及對.NET Core的看法。 俗話說“瑞雪兆豐年”,其實我想說這 ...
  • 第一種,自己手寫dockerfile發佈,上傳至hubDocker 1. 正常發佈到文件夾中,發佈文件上傳至linux機器上。如 /www/app 2. 將Dockerfile文件也複製到同目錄 。/www/app 3. 輸入 ,構建一個demo名字的鏡像。這個時候就會構建鏡像,輸入 可以查看當剛剛 ...
  • 之前都是看別人寫博客,自己沒有寫博客的習慣.在工作的過程中,總是會碰到許多的技術問題.有很多時候想記錄下來,後面一直有許多的問題等著解決.總想著等系統完成了,再回頭總結下.往往結果就把這事拋到腦後了. 總覺得不能一直這樣哈.今天簡單記一下吧.有表達不清楚的地方,多多包涵. 最近在研究.net orm ...
  • https://stackoverflow.com/questions/45875981/error while reading json file in dotnet core the configured user limit 128 on You are creating file watch ...
  • 在 .Net Core 2.2中 Microsoft.AspNetCore.App 預設內置了EntityFramework Core 包,所以在使用過程中,我們無需再從 NuGet 倉庫單獨應用 EFCore 包;本文並不打算深入的介紹 EFCore 的各種使用方式、原理解析,本文重點在於解決讓初... ...
  • 解決方法 定位到csproject 文件夾 問題解決 接下來正常進行CodeFirst操作:生成Migration [name] Upate Database 來源: pass:我會經常修改 不希望被轉載! ...
  • 先看下ASP.NET Core的啟動代碼,如下圖:通過以上代碼,我們可以初步得出以下結論:所有的ASP.NET Core程式本質上也是一個控制台程式,使用Program的Main方法作為程式的入口。控制台Main入口-->IWebHostBuilder-->IWebHost-->Run,發現本質上就... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...