6

मैं सक्रिय डायरेक्टरी और मानक रूपों को लॉगिन करने की कोशिश कर रहा हूं लेकिन एक चीज मुझे रोक रही है। मुझे वर्तमान विंडोज उपयोगकर्ता का नाम नहीं मिल रहा है। मुझे सबसे नज़दीकी मिला है var i = WindowsIdentity.GetCurrent();, लेकिन यह मुझे आईआईएस ऐप पूल उपयोगकर्ता का नाम देता है। मेरे पास आईआईएस में अनाम प्रमाणीकरण, प्रपत्र प्रमाणीकरण और विंडोज प्रमाणीकरण सक्षम है। मैं उपयोगकर्ताओं को एडी से लोड कर सकता हूं इसलिए मुझे लगता है कि मेरा web.config सही तरीके से सेटअप है।एक्टिव डायरेक्टरी वर्तमान उपयोगकर्ता नाम ASP.NET

संपादित:

<membership defaultProvider="HybridMembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="HybridMembershipProvider" type="MyApp.Data.HybridMembershipProvider" AspNetProviderName="AspNetSqlMembershipProvider" ActiveDirectoryProviderName="ADMembershipProvider" /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyAppConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
     <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnectionString" 
      attributeMapUsername="sAMAccountName" enableSearchMethods="true" attributeMapEmail="mail"/> 
     </providers> 
    </membership> 

संपादित करें 2: यह मेरा web.config (एक फसाड प्रदाता का उपयोग) है यहाँ मेरी आईआईएस सुरक्षा सेटअप है।

IIS Security setup

उत्तर

4

पर अलग-अलग उपयोगकर्ता विशेषताओं को इंगित करता है यदि आप आईआईएस में एएसपी.Net प्रतिरूपण चालू करते हैं, तो आप उपयोगकर्ता नाम जैसे उपयोगकर्ता नाम प्राप्त कर सकते हैं। यह केवल तभी काम करेगा जब वह फॉर्म फॉर्म सदस्यता प्रदाता/एडी में है , और वे बेनामी नहीं हैं

इसके अलावा, फॉर्म आधारित और विंडोज/एडी आधारित ऑथ मिश्रण करने योग्य है लेकिन अनुशंसित नहीं है। यदि आपको ऐसा करने की आवश्यकता है तो this देखें।

संपादित: मुझे लगता है मैं गलत समझा आप ऐसा यहां क्या चाहता था एक उच्च स्तरीय क्या ऊपर उल्लिखित समाधान के साथ चला जाता है की से अधिक glossing है:

यदि आप बेनामी प्रमाणीकरण बंद करें, और Asp.Net प्रतिरूपण पर बारी , जब भी कोई साइट पर जाता है तो आईआईएस 401 चुनौती करेगा।
यदि सब कुछ एक ही डोमेन पर है, तो वेब ब्राउज़र आईआईएस को आपके क्रेडेंशियल्स भेज देगा, आईआईएस उन्हें सक्रिय निर्देशिका के खिलाफ मान्य करेगा, और फिर एडी आईआईएस को काम करने की पहचान देगा।

जब आपके पास Asp.Net प्रतिरूपण चालू होता है, तो आईआईएस उस पहचान को वर्तमान थ्रेड/अनुरोध से जोड़ देगा। तो बाद प्रमाणीकरण होता है, तो आप सिर्फ वर्तमान धागा पहचान से उपयोगकर्ता नाम प्राप्त कर सकते हैं, और फिर सक्रिय निर्देशिका की तरह क्वेरी:

Context.User.Identity.Name 

:

using System.Threading; 
using System.DirectoryServices; 
using System.DirectoryServices.AccountManagement; 

...... 

PrincipalContext pc = null; 
UserPrincipal principal = null; 

try 
{ 
    var username = Thread.CurrentPrincipal.Identity.Name; 
    pc = new PrincipalContext(ContextType.Domain, "active.directory.domain.com"); 
    principal = UserPrincipal.FindByIdentity(pc, username); 

    var firstName = principal.GivenName ?? string.Empty 
    var lastName = principal.Surname ?? string.Empty 
    return string.Format("Hello {0} {1}!", firstName, lastName); 
} 
catch ... 
finally 
{ 
    if (principal != null) principal.Dispose(); 
    if (pc != null) pc.Dispose(); 
} 
+0

क्या आप अपने पहले दो बिंदुओं को थोड़ा और बता सकते हैं? आपका क्या मतलब है "यदि वह डेटा प्रपत्र सदस्यता प्रदाता/एडी में है"। वे एक उपयोगकर्ता हैं और मैं उपयोगकर्ता नाम से एडी पूछ सकता हूं। "अन्यथा आपको अपना नाम प्राप्त करने के लिए एडी से पूछना होगा।" - यदि मेरा नाम है तो मैं ऐसा कर सकता हूं, लेकिन मैं उनका नाम प्राप्त करने के लिए इसे कैसे करूँगा? – Echilon

+0

आपके लिए संपादित उत्तर, कृपया फिर से पढ़ें –

+0

मेरी समस्या यह है कि 'थ्रेड.कुरेंट प्रिंसिपल.इडेन्टिटी.Name ' खाली है, क्या मुझे उपयोगकर्ता नाम नहीं मिल सकता है। – Echilon

-1

मैं साथ आजमाइए चाहते हैं:

var i = Environment.CurrentUser;

और आप भी मेरी कक्षा का उपयोग कर सकते हैं: http://pastebin.com/xnYfVsLX

+0

मुझे नहीं लगता कि कि इच्छा है वेब ऐप्स के लिए काम, जिसे मैं मान रहा हूं वह है क्योंकि उन्होंने फॉर्म – Eonasdan

1

नेट क्षुधा मैं लिखा है, जहां मैं मैंने विंडोज प्रमाणीकरण का उपयोग किया है, मैं अभी भी एडी उपयोगकर्ता नाम प्राप्त करने के लिए User.Identity.Name का उपयोग कर सकता हूं। इसमें आमतौर पर डीसी शामिल है, और उपयोगकर्ताओं को एसएएम खाता नाम देता है। मैं एक ही समय में लागू करने की कोशिश नहीं कर रहा था लेकिन User.Identity.Name निश्चित रूप से अलग-अलग कामों के लिए

0

यह कोड का एक सेगमेंट है जिसका उपयोग मैंने अपने एएसपी.नेट एमवीसी ऐप में बहुत पहले नहीं किया था, इससे मुझे मदद मिली, पता नहीं अगर यह आपको हालांकि मदद मिलेगी, आप जांच करने के लिए हालांकि

private static void CheckIfUserExists(string p) 
    { 
     try 
     { 
       var user = (from x in Data.EntityDB.UserInfoes where x.SAMAccountName == p select x).FirstOrDefault(); 
       DirectoryEntry entry = new DirectoryEntry(Properties.Settings.Default.LDAPPath); //this is the connection to your active directory 
       DirectorySearcher search = new DirectorySearcher(entry); 
       search.PropertiesToLoad.Add("*"); 
       search.Filter = "(&(sAMAccountName=" + p + ")(objectCategory=person))"; 
       SearchResult searchResult = search.FindOne(); 
      //If the user under the alias is not found, Add a new user. Else, update his current data 
      if (user == null) 
      { 
       XXXXXXX.Models.UserInfo newUserEntry = new Models.UserInfo 
       { 
        SAMAccountName = p, 
        First_Name = searchResult.Properties.Contains("givenName") ? searchResult.Properties["givenName"][0].ToString() : string.Empty, 
        Last_Name = searchResult.Properties.Contains("sn") ? searchResult.Properties["sn"][0].ToString() : string.Empty, 
        Title = searchResult.Properties.Contains("title") ? searchResult.Properties["title"][0].ToString() : string.Empty, 
        Office = searchResult.Properties.Contains("l") ? searchResult.Properties["l"][0].ToString() : string.Empty, 
        Country = searchResult.Properties.Contains("c") ? searchResult.Properties["c"][0].ToString() : string.Empty, 
        Telephone = searchResult.Properties.Contains("telephoneNumber") ? searchResult.Properties["telephoneNumber"][0].ToString() : string.Empty, 
        Mobile_Phone = searchResult.Properties.Contains("mobile") ? searchResult.Properties["mobile"][0].ToString() : string.Empty, 
        Email_Address = searchResult.Properties.Contains("mail") ? searchResult.Properties["mail"][0].ToString() : string.Empty, 
        Image_Path = string.Format(Properties.Settings.Default.UserPicturePath, p), 
        LastUpdate = DateTime.Now, 
       }; 

अद्यतन

लें सूचना है कि मैं भी इस निकालने में एक अलग डेटाबेस पूछे, सभी Linq बयानों की अनदेखी के लिए स्वतंत्र हैं। DirectoryEntry, DirectorySearcher और SearchResult कक्षाओं को आपको जो चाहिए उसे आपकी सहायता करनी चाहिए।

अपडेट 2 चर पी HttpContext.Current.User.Identity संपत्ति से बदला जा सकता है

अद्यतन 3 यहाँ एलडीएपी नाम की वर्तमान सूची (जहां आप देख है searchResult.Properties.Contains ("") Over here जो सक्रिय निर्देशिका

+0

रूपों का उल्लेख किया है समस्या यह है कि 'HttpContext.Cu rrent.User.Identity' खाली है, और प्रमाणीकृत गलत है, इसलिए मेरे पास कोई उपयोगकर्ता नाम नहीं है, भले ही मैं एक एडी खाते पर हूं। – Echilon

+0

अजीब बात है। क्या आपने अपने वेब.कॉन्फिग में अपने एलडीएपी कनेक्शन में टैग सेट किया है? क्योंकि, यदि हां, और आप लॉग इन कर सकते हैं, HttpContext.Current.User।पहचान अशक्त – Eon

+0

<सदस्यता defaultProvider = "ADMembershipProvider"> नहीं होना चाहिए <नाम = "ADMembershipProvider" type = "System.Web.Security.ActiveDirectoryMembershipProvider, System.Web जोड़ने के लिए, संस्करण = 2.0.0.0, संस्कृति = तटस्थ , PublicKeyToken = b03f5f7f11d50a3a "connectionStringName =" ADConnectionString "connectionUsername =" कुछ "connectionPassword =" कुछ "attributeMapUsername =" sAMAccountName "enableSearchMethods =" true "attributeMapEmail =" मेल "/> Eon

1

यदि आप सक्रिय निर्देशिका के साथ प्रपत्र प्रमाणीकरण का उपयोग कर रहे हैं इस प्रयास करें // कोड स्निपेट

sub Page_Load(sender as object, e as EventArgs) 
    lblName.Text = "Hello " + Context.User.Identity.Name & "." 
    lblAuthType.Text = "You were authenticated using " & Context.User.Identity.AuthenticationType & "." 
end sub 

रेफरी:
Active Directory Authentication from ASP .NET
How to authenticate against the Active Directory by using forms authentication and Visual Basic .NET Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

रेफरी: आप कई तरीकों से में ASP.NET के साथ Windows प्रमाणीकरण का उपयोग कर सकते हैं: प्रतिरूपण बिना

  • Windows प्रमाणीकरण। यह डिफ़ॉल्ट सेटिंग है। ASP.NET संचालन करता है और अपने आवेदन की प्रक्रिया पहचान है, जो डिफ़ॉल्ट रूप से विंडोज सर्वर 2003 प्रतिरूपण साथ

  • Windows प्रमाणीकरण पर नेटवर्क सेवा खाता है का उपयोग करके संसाधनों तक पहुँचता है। इस दृष्टिकोण के साथ, आप प्रमाणीकृत उपयोगकर्ता का प्रतिरूपण करते हैं और संचालन और संसाधनों तक पहुंचने के लिए उस पहचान का उपयोग करते हैं।

  • निश्चित पहचान प्रतिरूपण के साथ विंडोज प्रमाणीकरण। इस दृष्टिकोण के साथ, आप एक विशिष्ट पहचान का उपयोग कर संसाधनों तक पहुंचने के लिए एक निश्चित विंडोज खाते का प्रतिरूपण करते हैं। विंडोज सर्वर 2003 पर, आपको इस प्रतिरूपण दृष्टिकोण से बचना चाहिए; इसके बजाय, कस्टम सेवा पहचान के साथ कस्टम एप्लिकेशन पूल का उपयोग करें।

प्रलेखन के अनुसार आप प्रमाणित उपयोगकर्ता के विंडोज टोकन प्राप्त कर सकते हैं।

IIdentity WinId= HttpContext.Current.User.Identity; 
WindowsIdentity wi = (WindowsIdentity)WinId; 

अगर कुछ गलत हो तो प्रति How To: Use Windows Authentication in ASP.NET 2.0

की MSDN प्रलेखन के रूप में अपने आवेदन प्रतिरूपण विधि जाँच उल्लेख ScottGu के लेख Recipe: Enabling Windows Authentication within an Intranet ASP.NET Web application

+0

एनबी: प्रपत्र प्रमाणीकरण उपयोग में लागू नहीं होता है। मैंने इसका उपयोग एएसपी.नेट एमवीसी के साथ किया है, और System.Web.HttpContext.Current.User एक सिस्टम.Web.Security.FormsIdentity ऑब्जेक्ट होगा। –

संबंधित मुद्दे