मैं ASP.NET का उपयोग करके विकसित एक वेब अनुप्रयोग के लिए कुछ असामान्य आवश्यकताओं को पूरा करने के लिए एक कस्टम प्राधिकरण/प्रमाणीकरण दिनचर्या बनाने के लिए से इनहेरिट हूँ System.Web.Http.AuthorizeAttribute के लिए ASP.NET वेब एपीआई AuthorizeAttribute अनुकूलित कैसे एमवीसी 4. यह वेब क्लाइंट से अजाक्स कॉल के लिए उपयोग की जाने वाली वेब एपीआई में सुरक्षा जोड़ता है। आवश्यकताएँ हैं:असामान्य आवश्यकताओं
- उपयोगकर्ता जब भी किसी लेन-देन के लिए प्रदर्शन को सत्यापित करने के बाद किसी लॉग ऑन और दूर चला गया है और कुछ किसी कार्य केंद्र के लिए ऊपर चला गया नहीं किया है लॉगऑन करना होगा।
- भूमिकाओं को प्रोग्राम समय पर वेब सेवा विधियों को असाइन नहीं किया जा सकता है। उन्हें रन टाइम पर असाइन किया जाना चाहिए ताकि व्यवस्थापक इसे कॉन्फ़िगर कर सके। यह जानकारी सिस्टम डेटाबेस में संग्रहीत है।
वेब ग्राहक एक single page application (SPA) तो ठेठ रूपों प्रमाणीकरण इतनी अच्छी तरह से काम नहीं करता है, लेकिन मैं के रूप में मैं आवश्यकताओं को पूरा कर सकते हैं ASP.NET सुरक्षा ढांचे के रूप में ज्यादा पुन: उपयोग कोशिश कर रहा हूँ। अनुकूलित AuthorizeAttribute वेब सेवा विधि से कौन सी भूमिकाएं जुड़ी हैं यह निर्धारित करने के लिए आवश्यकता 2 के लिए बहुत अच्छा काम करता है। मैं तीन पैरामीटर, एप्लिकेशन का नाम, संसाधन नाम और ऑपरेशन स्वीकार करता हूं यह निर्धारित करने के लिए कि कौन सी भूमिकाएं किसी विधि से जुड़ी हैं।
public class DoThisController : ApiController
{
[Authorize(Application = "MyApp", Resource = "DoThis", Operation = "read")]
public string GetData()
{
return "We did this.";
}
}
मैं भूमिकाओं हो और उपयोगकर्ता को प्रमाणित करने OnAuthorization विधि ओवरराइड। चूंकि उपयोगकर्ता को प्रत्येक लेनदेन के लिए प्रमाणीकृत होना पड़ता है, इसलिए मैं उसी चरण में प्रमाणीकरण और प्रमाणीकरण करके पीछे और आगे की चपेट में कमी करता हूं। मुझे मूल प्रमाणीकरण का उपयोग करके वेब क्लाइंट से उपयोगकर्ता प्रमाण-पत्र प्राप्त होते हैं जो HTTP शीर्षलेख में एन्क्रिप्टेड प्रमाण-पत्र पास करता है। तो मेरी OnAuthorization विधि इस प्रकार है:
public override void OnAuthorization(HttpActionContext actionContext)
{
string username;
string password;
if (GetUserNameAndPassword(actionContext, out username, out password))
{
if (Membership.ValidateUser(username, password))
{
FormsAuthentication.SetAuthCookie(username, false);
base.Roles = GetResourceOperationRoles();
}
else
{
FormsAuthentication.SignOut();
base.Roles = "";
}
}
else
{
FormsAuthentication.SignOut();
base.Roles = "";
}
base.OnAuthorization(actionContext);
}
GetUserNameAndPassword HTTP हेडर से साख प्राप्त करता है। मैं फिर सदस्यता का उपयोग करता हूं। प्रमाणीकरण मान्य करने के लिए ValidateUser। मेरे पास एक कस्टम सदस्यता प्रदाता और भूमिका प्रदाता है जो एक कस्टम डेटाबेस हिट करने के लिए प्लग इन है। यदि उपयोगकर्ता प्रमाणीकृत है तो मैं संसाधन और संचालन के लिए भूमिकाएं पुनर्प्राप्त करता हूं। वहां से मैं प्रमाणीकरण प्रक्रिया को पूरा करने के लिए आधार ऑन प्राधिकरण का उपयोग करता हूं। यहां वह जगह है जहां यह टूट जाता है।
यदि उपयोगकर्ता प्रमाणित है तो मैं उपयोगकर्ता को लॉग इन करने के लिए मानक प्रपत्र प्रमाणीकरण विधियों का उपयोग करता हूं (FormsAuthentication.SetAuthCookie) और यदि वे विफल हो जाते हैं तो मैं उन्हें लॉग आउट करता हूं (फॉर्म प्रमाणीकरण। साइनऑट)। लेकिन समस्या यह है कि आधार ऑन प्राधिकरण कक्षा में तक पहुंच नहीं है प्रिंसिपल अद्यतन किया गया है ताकि मान्य किया गया सही मान पर सेट है। यह हमेशा एक कदम पीछे है। और मेरा अनुमान है कि यह कुछ कैश किए गए मान का उपयोग कर रहा है जो वेब क्लाइंट के लिए एक राउंड ट्रिप होने तक अद्यतन नहीं होता है।
तो यह सब मेरी विशिष्ट सवाल यह है कि जो अप करने के लिए जाती है, तो कुकीज़ का उपयोग किए बिना वर्तमान प्रधान के लिए सही मान को IsAuthenticated स्थापित करने के लिए एक और तरीका है? ऐसा लगता है कि कुकीज वास्तव में इस विशिष्ट परिदृश्य में लागू नहीं होती हैं जहां मुझे हर बार प्रमाणित करना होता है।कारण मैं जानता हूँ कि IsAuthenticated सही मान पर सेट नहीं है मैं भी इस के लिए HandleUnauthorizedRequest विधि ओवरराइड है:
protected override void HandleUnauthorizedRequest(HttpActionContext filterContext)
{
if (((System.Web.HttpContext.Current.User).Identity).IsAuthenticated)
{
filterContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
यह मैं विफलता अगर वेब ग्राहक के लिए निषिद्ध का स्थिति कोड वापस लौट सकते हैं प्रमाणीकरण के बजाय प्राधिकरण की वजह से था और यह तदनुसार जवाब दे सकता है।
तो IsAuthenticated इस परिदृश्य में वर्तमान सिद्धांत के लिए स्थापित करने के लिए उचित तरीके क्या है?
क्या आप GetUserNameAndPassword (actionContext, उपयोगकर्ता नाम से बाहर पासवर्ड) के लिए विधि निकाय साझा कर सकते हैं? –
@ विजय बाल्कवाडे - यह कोड अब SimpleSecurity ओपन सोर्स प्रोजेक्ट का हिस्सा है। आप यहां GetUserNameAndPassword के लिए पूर्ण स्रोत कोड प्राप्त कर सकते हैं। https://simplesecurity.codeplex.com/SourceControl/latest#SimpleSecurity.Filters/BasicAuthorizeAttribute.cs –
चूंकि कोडप्लेक्स जल्द ही बंद हो रहा है, इसलिए मैंने [GetUserNameAndPassword' को एक पेस्टबिन में कॉपी किया है] (https://pastebin.com/Yq86aNjL)। –