मैं एक एमएसएसएलएल बैकएंड के साथ एमवीसी 3 का उपयोग कर इंट्रानेट एप्लिकेशन का निर्माण कर रहा हूं। मेरे पास प्रमाणीकरण और भूमिकाएं हैं (कस्टम भूमिका प्रदाता के माध्यम से) ठीक से काम कर रही हैं। जो मैं अब करने की कोशिश कर रहा हूं वह उपयोगकर्ता को ओवरराइड कर रहा है। उपयोगकर्ता की तरह वस्तुओं की अनुमति देने के लिए इडेंटिटी। इडेंटिटी.फर्स्टनाम। लेकिन मैं किसी भी कोड है कि मुझे पता चलेगा कि मैं एक कस्टम प्रदाता लेखन की कोशिश की है WindowsIdentityएमवीसी 3 विंडोज प्रमाणीकरण उपयोगकर्ता को ओवरराइड करें। छवि
में ऐसा नहीं कर पा सकते हैं:
public class CPrincipal : WindowsPrincipal
{
UserDAL userDAL = new UserDAL();
public CPrincipal(WindowsIdentity identity)
: base(identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.identity = identity;
}
public UserInfo userInfo { get; private set; }
public WindowsIdentity identity { get; private set; }
}
और WindowsAuthentication अधिभावी कस्टम प्रिंसिपल को भरने के लिए।
void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e)
{
if (e.Identity != null && e.Identity.IsAuthenticated)
{
CPrincipal cPrincipal = new CPrincipal(e.Identity);
HttpContext.Current.User = cPrincipal;
}
}
मेरे पास प्रमाणीकरण फ़ंक्शन में ब्रेकपॉइंट है और प्रिंसिपल पॉप्युलेट किया जा रहा है; हालांकि, जब मैं नियंत्रकों में ब्रेकपॉइंट डालता हूं, तो उपयोगकर्ता मेरे कस्टम प्रिंसिपल की जगह केवल सामान्य रोल प्रिंसिपल है। मैं क्या गलत कर रहा हूं?
संपादित करें:
मैं Global.asax में उपरोक्त कोड बाहर टिप्पणी की। मैं अधिरोहित है AuthorizeAttribute का उपयोग कर सी #: के लिए
public class CAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
return false;
}
IIdentity user = httpContext.User.Identity;
CPrincipal cPrincipal = new CPrincipal(user);
httpContext.User = cPrincipal;
return true;
}
}
और मेरे प्रिंसिपल समायोजित निम्नलिखित:
:public class CPrincipal : IPrincipal
{
private UserDAL userDAL = new UserDAL();
public CPrincipal(IIdentity identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.Identity = identity;
}
public UserInfo userInfo { get; private set; }
public IIdentity Identity { get; private set; }
public bool IsInRole(string role)
{
throw new NotImplementedException();
}
}
अब मैं जब मैं में एक ब्रेकपाइंट शब्दों में कहें, घड़ी उपयोगकर्ता में निम्नलिखित से पता चलता
- उपयोगकर्ता
- [CSupport.Model.CPrincipal]
- पहचान
पहचान सुलभ है, हालांकि, यह अभी भी WindowsIdentity सीपी निदेशक केवल घड़ी में पहुंच योग्य है और सीधे पहुंच योग्य नहीं है।
संपादित करें: इस में योगदान करने वाले सभी लोगों के लिए धन्यवाद। आपने विभिन्न भागों को कैसे काम किया है, इस बारे में मेरी समझ में काफी विस्तार किया है।
मुझे काम करने के दोनों तरीके मिल गए, इसलिए मैंने सोचा कि मैं साझा करूंगा।
विकल्प 1: Global.asax
में अधिकृत अनुरोध ओवरराइड यह एक मैं के साथ जा रहा हूँ है।
मैंने Application_AuthenticateRequest का उपयोग नहीं किया क्योंकि (HttpContext.Current.User is null even though Windows Authentication is on) उपयोगकर्ता को Windows प्रमाणीकरण प्रक्रिया में पॉप्युलेट नहीं किया गया है और इस प्रकार उपयोगकर्ता की जानकारी प्राप्त करने के लिए मैं कुछ भी नहीं कर सकता।
एप्लिकेशन_अधिकृत अनुरोध श्रृंखला में अगला है और विंडोज पहचान के बाद होता है।
protected void Application_AuthorizeRequest(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated && Roles.Enabled)
{
Context.User = new FBPrincipal(HttpContext.Current.User.Identity);
}
}
यह इस तरह आप नए प्रधान बनाया गया था कि में अद्यतन जानकारी का उपयोग है प्रधान
public class CPrincipal : IPrincipal
{
private UserDAL userDAL = new UserDAL();
public CPrincipal(IIdentity identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.Identity = identity;
}
public UserInfo userInfo { get; private set; }
public IIdentity Identity { get; private set; }
public bool IsInRole(string role)
{
return userDAL.IsUserInRole(userInfo.UserName, role);
}
}
की ओवरराइड है।
[Authorize(Roles = "super admin")]
public ActionResult Dashboard()
{
string firstname = (User as CPrincipal).userInfo.FirstName; // <--
DashboardModel dModel = reportDAL.GetChartData();
return View(dModel);
}
विकल्प 2: AuthorizeAttribute
ओवरराइड यह है ओवरराइड प्रधान (यह वही ऊपर के रूप में है)
public class CPrincipal : IPrincipal
{
private UserDAL userDAL = new UserDAL();
public CPrincipal(IIdentity identity)
{
userInfo = userDAL.GetUserProfile(identity.Name.Split('\\')[1]);
this.Identity = identity;
}
public UserInfo userInfo { get; private set; }
public IIdentity Identity { get; private set; }
public bool IsInRole(string role)
{
return userDAL.IsUserInRole(userInfo.UserName, role);
}
}
यहाँ अधिकृत की ओवरराइड गुण है
public class CAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
return false;
}
IIdentity user = httpContext.User.Identity;
CPrincipal cPrincipal = new CPrincipal(user);
httpContext.User = cPrincipal;
return true;
}
}
यह वह जगह है जहां आप नई सूचना के उपयोग और उपयोग करने के लिए प्राधिकृत एट्रिब्यूट बदलते हैं tion।
[CAuthorize(Roles = "super admin")] // <--
public ActionResult Dashboard()
{
string firstname = (User as CPrincipal).userInfo.FirstName; // <--
DashboardModel dModel = reportDAL.GetChartData();
return View(dModel);
}
विकल्प 1 वैश्विक स्तर पर कुछ भी संभालता है, विकल्प 2 व्यक्तिगत स्तर पर सब कुछ संभालता है।
प्रतीक्षा करें ... वह ईवेंट हैंडलर क्या है? आप एएसपी.NET लॉगिन नियंत्रण का उपयोग करने की कोशिश नहीं कर रहे हैं? यह घटना कहां स्थित है और यह किस घटना में है? –
मैं इंट्रानेट साइट पर विंडोज प्रमाणीकरण का उपयोग कर रहा हूं। यह घटना हैंडलर वैश्विक में है।Asax –
global.asax में कोई ऑन प्रमाणीकरण हैंडलर नहीं है। शायद यही कारण है कि आपको समस्याएं आ रही हैं। –