در این مقاله، من اطلاعاتی در مورد نحوه مجوز دادن به کاربران وارد شده در ویندوز با استفاده از گروه های Windows Active Directory در صفحات Razor ارائه خواهم داد. برای مشاهده نحوه ایجاد یک برنامه وب NET Core با صفحات Razor و بازیابی داده ها از SQL Server با استفاده از Entity Framework، می توانید از مقاله قبلی من دیدن کنید .
در زیر نرم افزار/مفاهیم مورد استفاده در این سند آمده است.
- ویژوال استودیو 2019
- صفحات تیغ
- Net Core 2.1
- برنامه وب Net Core
- زبان سی شارپ
معرفی
بهترین روش برای طراحی یک برنامه کاربردی این است که در مورد فرآیندی که توسط آن کاربر را برای ورود به برنامه احراز هویت می کنیم و سپس به کاربر اجازه استفاده از عملکردهای برنامه را مجاز می کنیم، بسیار مطمئن باشیم. در این مقاله، من قبلاً از احراز هویت ویندوز هنگام ایجاد برنامه وب استفاده کردهام و اکنون نحوه استفاده از گروههای اکتیو دایرکتوری ویندوز را برای مجوز دادن به کاربر وارد شده در ویندوز نشان میدهم. در زیر توضیح گام به گام نحوه دستیابی به این هدف در صفحات تراشه هسته دات نت ارائه شده است.
پروژه خود را در Visual Studio 2019 باز کنید
در مورد من، من پروژه ایجاد شده قبلی را که در آن صفحات Razor وجود دارد باز می کنم.
راه های دستیابی به مجوز در برنامه وب اصلی دات نت
راههای متعددی برای دستیابی به مجوز وجود دارد، مانند استفاده از مجوز مبتنی بر نقش سفارشی، استفاده از مجوز مبتنی بر سیاست، به سادگی فراخوانی روش برای بررسی اینکه آیا کاربر مجاز به دسترسی به روش است یا نه، و غیره. در اینجا، دو روش زیر را مورد بحث قرار خواهیم داد. .
- استفاده از مجوز مبتنی بر نقش سفارشی.
- استفاده از یک روش سفارشی برای بررسی اینکه آیا کاربر وارد شده بخشی از Windows AD Group است یا خیر.
مجوز سفارشی مبتنی بر نقش در برنامه وب اصلی دات نت
- یک کلاس جدید ایجاد کنید که IClaimsTransformation را گسترش دهد.
- public class ClaimsTransformer : IClaimsTransformation
- {
- public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
- {
- var wi = (WindowsIdentity)principal.Identity;
- if (wi.Groups != null)
- {
- foreach (var group in wi.Groups) //-- Getting all the AD groups that user belongs to---
- {
- try
- {
- var claim = new Claim(wi.RoleClaimType, group.Value);
- wi.AddClaim(claim);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- }
- return Task.FromResult(principal);
- }
- }
- خط زیر را به متد configureService خود در Startup.cs اضافه کنید زیرا کلاس خود را ایجاد کرده اید که IClaimsTransformation را گسترش می دهد.
- services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
- در Controller خود، خط "Authorize" را اضافه کنید تا مجوز را برای هر روشی که میخواهید مجوز را اجرا کنید، دریافت کنید.
- [Route("api/[controller]/[action]")]
- [ApiController]
- public class MYListsController : ControllerBase
- {
- [Authorize(Roles = "Admin")]
- [HttpGet]
- [ActionName("GetMyList")]
- public bool GetMyList()
- عملکرد را با اشکال زدایی آزمایش کنید. در مثال من، من بخشی از "Admin" Windows AD Group هستم. از این رو، هنگام اشکال زدایی، به روش "GetMyList" می رسم. اگر خط "Authorize" را به [Authorize(Roles = "Contribute")] تغییر دهم، حتی به روش "GetMyList" هم نمی رسد زیرا من بخشی از این گروه AD Windows نیستم.
- به طور مشابه، خط Authorize را می توان برای کل PageModel در Razor Pages استفاده کرد، زیرا در حال حاضر راهی برای مجوز دادن به هر اقدامی در داخل صفحه مدل نداریم.
روش سفارشی برای مجوز دادن به کاربر در NET Core Web Application
- یک کلاس جدید در برنامه وب .NET Core خود ایجاد کنید و روشی برای بررسی اینکه آیا کاربر فعلی بخشی از گروه AD است یا خیر، داشته باشید. در مثال خود، کلاسی با نام "امنیت" ایجاد کرده ام.
- public static class Security
- {
- public static bool IsInGroup(ClaimsPrincipal User, string GroupName)
- {
- bool check = false;
- var user = (WindowsIdentity)User.Identity;
- if (user.Groups != null)
- {
- foreach (var group in user.Groups)
- {
- check = group.Translate(typeof(NTAccount)).ToString().Contains(GroupName);
- if (check)
- break;
- }
- }
- return check;
- }
- }
- در Controller خود می توانید این متد را برای بررسی کاربر فراخوانی کرده و سپس بر اساس خروجی می توانید عملکرد را گسترش دهید.
- [HttpGet]
- [ActionName("GetMyList")]
- public bool GetMyList()
- {
- var check = Security.IsInGroup(User, "Admin");//--- Returning true as I am not part of Contribute AD Group
- var check1 = Security.IsInGroup(User, "Contribute"); //--- Returning false as I am not part of Contribute AD Group
- return check;
- }.
- عملکرد را با اشکال زدایی آزمایش کنید. در مثال من، من بخشی از "Admin" Windows AD Group هستم. از این رو، هنگام اشکالزدایی، برای خط اول True میگیرم، اما برای خط دوم، (Security.IsInGroup(User,”Contribute”)؛ من اشتباه میگیرم زیرا بخشی از این گروه AD ویندوز نیستم.
- به طور مشابه، متد Security.IsInGroup را می توان از PageModel و همچنین در Razor Pages فراخوانی کرد تا به کاربر اجازه دهد.
همین است. امیدوارم از این مقاله چیز جدیدی یاد گرفته باشید و از آن در کار خود استفاده کنید.