ASP.NET MVC कस्टम भूमिका प्रदाता कैसे बनाएं



asp.net-mvc asp.net-mvc-5 (1)

एएसपी एमवीसी के लिए अपेक्षाकृत नया होने के नाते, मुझे अनिश्चितता है जो मेरी आवश्यकताओं के अनुरूप बेहतर होगा। मैंने विंडोज प्रमाणीकरण का उपयोग करते हुए इंट्रानेट साइट का निर्माण किया है और मैं सक्रिय निर्देशिका भूमिकाओं का उपयोग कर नियंत्रकों और कार्यों को सुरक्षित करने में सक्षम हूं, उदा।

[Authorize(Roles="Administrators")]
[Authorize(Users="DOMAIN\User")]
public ActionResult SecureArea()
{
    ViewBag.Message = "This is a secure area.";
    return View();
}

मुझे एडी भूमिकाओं से स्वतंत्र अपनी खुद की सुरक्षा भूमिकाओं को परिभाषित करने की आवश्यकता है। वांछित कार्यक्षमता यह है कि प्रमाणीकृत उपयोगकर्ताओं को मेरे अनुप्रयोग डेटाबेस जैसे "प्रबंधक", "उपयोगकर्ता", "अतिथि", "विश्लेषक", "डेवलपर" आदि में अपनी प्रोफाइल से जुड़े एक या अधिक भूमिकाओं के अनुसार विशिष्ट क्रियाओं तक पहुंच प्रदान की जाती है।

मैं कस्टम भूमिका प्रदाता और / या कस्टम प्राधिकरण विशेषता (ओं) को कैसे बनाऊं?

संपादित करें: अन्य उपयोगकर्ताओं के लिए पोस्ट की सामग्री की पहचान करना आसान बनाने के लिए शीर्षक और प्रश्न को संपादित किया गया।


मेरा समाधान एक कस्टम भूमिका प्रदाता बनाने के लिए था यहां दिए गए कदम हैं, अगर किसी और को बाद में सहायता की आवश्यकता हो तो:

अपने कस्टम उपयोगकर्ता और भूमिका कक्षाएं बनाएं

using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Security.Models.Security
{
    public class AppRole : IdentityRole
    {
    }
}

तथा

using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Security.Models.Security
{
    public class AppUser : IdentityUser
    {
    }
}

अपना डेटाबेस संदर्भ सेट करें

using Microsoft.AspNet.Identity.EntityFramework;
using Security.Models.Security;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace Security.Models.DAL
{
    public class UserContext : IdentityDbContext<AppUser>
    {
        public UserContext() : base("UserContext")
        {
            Database.SetInitializer<UserContext>(new CreateDatabaseIfNotExists<UserContext>());
        }
    }
}

अपना रोल प्रदाता बनाएं और निम्न विधियां लागू करें

using Security.Models.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace Security.Models.Security
{
    public class AppRoleProvider : RoleProvider
    {
        public override string[] GetAllRoles()
        {
            using (var userContext = new UserContext())
            {
                return userContext.Roles.Select(r => r.Name).ToArray();
            }
        }

        public override string[] GetRolesForUser(string username)
        {
            using (var userContext = new UserContext())
            {
                var user = userContext.Users.SingleOrDefault(u => u.UserName == username);
                var userRoles = userContext.Roles.Select(r => r.Name);

                if (user == null)
                    return new string[] { };
                return user.Roles == null ? new string[] { } :
                    userRoles.ToArray();
            }
        }

        public override bool IsUserInRole(string username, string roleName)
        {
            using (var userContext = new UserContext())
            {
                var user = userContext.Users.SingleOrDefault(u => u.UserName == username);
                var userRoles = userContext.Roles.Select(r => r.Name);

                if (user == null)
                    return false;
                return user.Roles != null &&
                    userRoles.Any(r => r == roleName);
            }
        }
    }
}

डेटाबेस कनेक्शन और भूमिका प्रदाता संदर्भ सेट करने के लिए अपने web.config को संपादित करें

<connectionStrings>
    <add name="UserContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\UserContext.mdf;Initial Catalog=UserContext;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>

तथा

<system.web>
    ...
    <authentication mode="Windows" />        
    <roleManager enabled="true" defaultProvider="AppRoleProvider">
      <providers>
        <clear/>
        <add name="AppRoleProvider" type="Security.Models.Security.AppRoleProvider" connectionStringName = "UserContext"/>
      </providers>
      ...
    </roleManager>
  </system.web>

पैकेज प्रबंधक कंसोल में, माइग्रेशन सक्षम करें

enable-migrations

नए बनाए गए Configurations.cs में उपयोगकर्ता / भूमिका स्टोर्स और प्रबंधकों को सेट अप करें और '\' वर्ण स्वीकार करने के लिए उपयोगकर्ता प्रबंधक वैदिक को कॉन्फ़िगर करें

namespace Security.Migrations
{
    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Security.Models.Security;
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<Security.Models.DAL.UserContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            ContextKey = "Security.Models.DAL.UserContext";
        }

        protected override void Seed(Security.Models.DAL.UserContext db)
        {
            // Set up the role store and the role manager
            var roleStore = new RoleStore<AppRole>(db);
            var roleManager = new RoleManager<AppRole>(roleStore);

            // Set up the user store and the user mananger
            var userStore = new UserStore<AppUser>(db);
            var userManager = new UserManager<AppUser>(userStore);

            // Ensure that the user manager is able to accept special characters for userNames (e.g. '\' in the 'DOMAIN\username')            
            userManager.UserValidator = new UserValidator<AppUser>(userManager) { AllowOnlyAlphanumericUserNames = false };

            // Seed the database with the administrator role if it does not already exist
            if (!db.Roles.Any(r => r.Name == "Administrator"))
            {
                var role = new AppRole { Name = "Administrator" };
                roleManager.Create(role);
            }

            // Seed the database with the administrator user if it does not already exist
            if (!db.Users.Any(u => u.UserName == @"DOMAIN\admin"))
            {
                var user = new AppUser { UserName = @"DOMAIN\admin" };
                userManager.Create(user);
                // Assign the administrator role to this user
                userManager.AddToRole(user.Id, "Administrator");
            }
        }
    }
}

पैकेज प्रबंधक कंसोल में, यह सुनिश्चित करें कि डेटाबेस बनाया और वरीयता दी गई है

update-database

एक कस्टम प्राधिकरण विशेषता बनाएं जो असफलता पर पहुंच अस्वीकृत पृष्ठ पर रीडायरेक्ट होगा

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Security.Models.Security
{
    public class AccessDeniedAuthorizationAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if(filterContext.Result is HttpUnauthorizedResult)
            {
                filterContext.Result = new RedirectResult("~/Home/AccessDenied");
            }
        }
    }
}

हो गया! अब आप एक प्रवेश अस्वीकृत पृष्ठ बना सकते हैं (इस मामले में ~ / होम / एक्सेसडिनिड) और किसी भी कार्यवाही के लिए विशेषता लागू करें, उदा।

using Security.Models.Security;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Security.Controllers
{
    public class HomeController : Controller
    {
         ...    

        [AccessDeniedAuthorizationAttribute(Roles = "Administrator")]
        public ActionResult SecureArea()
        {
            return View();
        }

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

        ...
    }
}

आशा है कि यह भविष्य में किसी को मदद करता है। सौभाग्य!





asp.net-authorization