91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在asp.net core2.2中實現多用戶驗證與授權

發布時間:2021-06-08 16:19:17 來源:億速云 閱讀:153 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關怎么在asp.net core2.2中實現多用戶驗證與授權,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

前言

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

  • cookie身份驗證

  • 基于角色的授權

我的項目有兩類用戶:

  • 微信公眾號用戶,用戶名為公眾號的openid

  • 企業微信的用戶,用戶名為企業微信的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

修改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");
   });

修改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運行,截屏如下:

怎么在asp.net core2.2中實現多用戶驗證與授權

怎么在asp.net core2.2中實現多用戶驗證與授權

怎么在asp.net core2.2中實現多用戶驗證與授權


 怎么在asp.net core2.2中實現多用戶驗證與授權

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


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

 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");
 }
  • 返回類型為Task<IActionResult> ,因為懶得寫View,順手寫了句return Content("OK");

  • 從網站復制過來代碼,AuthenticationProperties沒有設置任何內容

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

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

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

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

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

看完上述內容,你們對怎么在asp.net core2.2中實現多用戶驗證與授權有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云浮市| 达州市| 无为县| 望江县| 新邵县| 杭州市| 黔西| 桂平市| 侯马市| 盐池县| 广德县| 开阳县| 沙洋县| 略阳县| 通榆县| 贺州市| 尼玛县| 宣城市| 曲阜市| 温泉县| 新竹县| 牙克石市| 胶南市| 茶陵县| 那曲县| 绥德县| 若尔盖县| 义马市| 曲阳县| 新疆| 洛浦县| 彰化市| 德庆县| 富裕县| 恭城| 新乡县| 宁晋县| 广州市| 邢台市| 邵阳市| 安龙县|