दशकों से विभिन्न प्रमाणीकरण और प्राधिकरण तकनीकों का उपयोग करने के बाद, मेरा वर्तमान एमवीसी एप्लिकेशन निम्न पद्धति का उपयोग करता है।
सभी प्राधिकरणों के लिए दावों का उपयोग किया जाता है। उपयोगकर्ताओं को एक भूमिका सौंपी जाती है (कई भूमिकाएं संभव हैं लेकिन मुझे इसकी आवश्यकता नहीं है) - नीचे और अधिक।
जैसा कि आम है, A ClaimsAuthorize विशेषता वर्ग का उपयोग किया जाता है। चूंकि अधिकांश नियंत्रक क्रियाएं CRUD हैं, इसलिए मुझे कोड-पहली डेटाबेस पीढ़ी में एक दिनचर्या मिलती है जो सभी नियंत्रक क्रियाओं को पुनरावृत्त करती है और प्रत्येक कंट्रोलर एक्शन विशेषता के रीड / एडिट / क्रिएट / डिलीट के लिए दावा प्रकार बनाती है। जैसे,
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
MVC व्यू में उपयोग के लिए, एक बेस कंट्रोलर क्लास व्यू बैग आइटम प्रस्तुत करता है
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// get user claims
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get all user claims on this controller. In this controler base class, [this] still gets the descendant instance type, hence name
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
// set Viewbag with default authorisations on this controller
ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
}
base.OnActionExecuting(filterContext);
}
वेबसाइट मेनू और अन्य गैर-नियंत्रक कार्यों के लिए, मेरे पास अन्य दावे हैं। उदाहरण के लिए, क्या कोई उपयोगकर्ता किसी विशेष मौद्रिक क्षेत्र को देख सकता है।
bool UserHasSpecificClaim(string claimType, string claimValue)
{
// get user claims
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get the specific claim if any
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
तो रोल्स कहाँ में फिट होते हैं?
मेरे पास एक तालिका है जो दावों के लिए एक भूमिका (डिफ़ॉल्ट) सेट को लिंक करती है। उपयोगकर्ता प्राधिकरण सेट करते समय, डिफ़ॉल्ट उपयोगकर्ता को उनकी भूमिका के दावे देने के लिए है। प्रत्येक उपयोगकर्ता के डिफ़ॉल्ट से अधिक या कम दावे हो सकते हैं। संपादन सरल बनाने के लिए, दावों की सूची नियंत्रक और कार्यों (एक पंक्ति में) द्वारा दर्शाई जाती है, अन्य दावों के साथ फिर सूचीबद्ध की जाती है। बटनों का उपयोग दावों का चयन करने के लिए आवश्यक "क्लिक" को कम करने के लिए कार्रवाई के एक सेट का चयन करने के लिए जावास्क्रिप्ट के एक बिट के साथ किया जाता है। सहेजें पर, उपयोगकर्ता के दावे हटा दिए जाते हैं और सभी चयनित दावे जोड़ दिए जाते हैं। वेब एप्लिकेशन लोड केवल एक बार दावा करता है, इसलिए इस स्थिर डेटा के भीतर किसी भी परिवर्तन को पुनः लोड करना होगा।
प्रबंधक इसलिए यह दावा कर सकते हैं कि प्रत्येक भूमिका में कौन से दावे हैं और कौन सा दावा है कि एक उपयोगकर्ता ने उन्हें एक भूमिका के लिए निर्धारित किया है और उन डिफ़ॉल्ट दावों को। सिस्टम में केवल कुछ ही उपयोगकर्ता हैं इसलिए इस डेटा को प्रबंधित करना सीधा है