Asp.net

在 asp 中用於 Windows 身份驗證的簡單自定義角色。網?

  • July 17, 2019

在我們的公司網路中,沒有為我的應用程序適當地分配 Active Directory(AD) 中的角色。所以我在我的數據庫中創建了一個簡單的表,映射了 AD 中的所有使用者及其角色。此表中實際上只有兩列,使用者和角色。

我希望利用 asp.net 中強大的角色管理功能,我想使用[Authorize(Roles = "Managers")]. 有沒有一種簡單的方法來使用這些自定義角色而無需設置複雜的角色和成員資格提供者?

應用背景:sql server、linq、asp.net mvc

實現自定義角色提供者真的很容易。基本上你需要實現兩個功能。

看文章:MVC 的自定義角色提供者

網站出現故障時提供的文章。

MVC 的自定義角色提供程序

在上一篇文章中,我解釋瞭如何創建自定義成員資格提供程序來授權使用者並保護控制項和頁面。但是,如果您想為特定的使用者組顯示或保護某些區域、控制器或頁面怎麼辦?例如,只允許管理員訪問管理面板。

在 .Net Framework 中用於此目的的是角色提供者。但同樣,它使用自己的數據庫儲存使用者角色。因此,讓我們創建和配置將使用我們的數據庫或任何其他儲存的自定義角色提供程序。和以前一樣,我們應該從 .NET 覆蓋類:

在此處輸入圖像描述

在此處輸入圖像描述

在此處輸入圖像描述

對於最小功能,我們需要實現和覆蓋兩個函式 GetRolesForUser 和 IsUserInRole。首先,一個用於獲取所有使用者角色(或組)的列表:

public override string[] GetRolesForUser(string username)
{
   using (DatabaseEntities db = new DatabaseEntities())
   {
       User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));

       var roles = from ur in user.UserRoles
                   from r in db.Roles
                   where ur.RoleId == r.Id
                   select r.Name;
       if (roles != null)
           return roles.ToArray();
       else
           return new string[] {}; ;
   }
}

如您所見,我通過函式的使用者名參數在我的數據庫中找到使用者(在我的情況下,它可以是使用者名或電子郵件)並創建使用者角色的字元串列表。

第二個功能是檢查使用者是否在角色(或組)中:

public override bool IsUserInRole(string username, string roleName)
{
   using (DatabaseEntities db = new DatabaseEntities())
   {
       User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));

       var roles = from ur in user.UserRoles
                   from r in db.Roles
                   where ur.RoleId == r.Id
                   select r.Name;
       if (user != null)
           return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase));
       else
           return false;
   }
}

然後我們需要在 web.config 文件中配置解決方案以使用創建的角色提供程序。出於調試目的,可能需要設置cacheRolesInCookie為 false,否則行為將不可預測。

<system.web>
   <compilation debug="true" targetFramework="4.5.2" />
   <httpRuntime targetFramework="4.5.2" />
   <authentication mode="Windows" />
   <authorization>
       <deny users="?" />
   </authorization>
   <roleManager cacheRolesInCookie="true" defaultProvider="KitsulaRoleProvider" enabled="true">
       <providers>
           <clear />
           <add name="KitsulaRoleProvider" type="Kitsula.Security.KitsulaRoleProvider" />
       </providers>
   </roleManager>
</system.web>

現在,您可以通過設置 Authorize 屬性保護具有指定角色的特定使用者組的控制器、操作、頁面:

using System;
using System.Web.Mvc;

namespace Kitsula.Areas.Admin.Controllers
{
   [Authorize(Roles = "Administrators")]
   public class HomeController : Controller
   {
       //
       // GET: /Admin/Home/

       public ActionResult Index()
       {
           return View();
       }

   }
}

引用自:https://stackoverflow.com/questions/10358525