2009-07-24 21 views
20

के भीतर वर्तमान विंडोज उपयोगकर्ता नाम प्राप्त करें क्या वर्तमान में सिल्वरलाइट के साथ उपयोगकर्ता के उपयोगकर्ता नाम में लॉग इन करना संभव है? आप मान सकते हैं कि उपयोगकर्ता के पास विंडोज ओएस है और सिल्वरलाइट एप्लिकेशन इंटरनेट एक्सप्लोरर में होस्ट किया गया है। ASP.NET के साथ सर्वर पक्ष से पहचान प्राप्त करना एक विकल्प नहीं है, यह सिल्वरलाइट एप्लिकेशन एक स्थिर HTML फ़ाइल पर होस्ट किया जाएगा।सिल्वरलाइट

उत्तर

27

दुर्भाग्यवश, मुझे नहीं लगता कि यह संभव है।

हालांकि आप कहते हैं कि हम विंडोज ओएस/आईई मान सकते हैं, सिल्वरलाइट स्वयं निश्चित रूप से यह नहीं मानता है, इसलिए आम तौर पर सामान्य .NET तंत्र जो उपयोगकर्ता के नाम पर वर्तमान लॉग इन करने के लिए हमारे लिए उपलब्ध होंगे, सिल्वरलाइट ऐप्स के लिए उपलब्ध ढांचे के सबसेट के भीतर मौजूद है:

यानी।

System.Net.CredentialCache.DefaultCredentials 
System.Security.Principal.WindowsIdentity.GetCurrent().Name 
Environment.UserName 

एक Windows रूपों में (जैसे) जबकि आवेदन, इन तंत्रों में से प्रत्येक का उपयोग करने के लिए उपलब्ध है, एक Silverlight आवेदन के भीतर उपलब्ध नहीं सब कर रहे हैं।

मुझे लगता है कि यह वास्तव में समझ में आता है, क्योंकि इस बात की कोई गारंटी नहीं है कि सिल्वरलाइट एप्लिकेशन विंडोज/आईई मंच के शीर्ष पर चल रहा है।

संयोग से, इस सवाल का भी यहाँ पर कहा गया था:

Current Windows Username and Domain

और कहा कि धागा है कि वहाँ कोई देशी तरीका इस लक्ष्य को हासिल करने के लिए पुष्टि करने के लिए लगता है। तब थ्रेड एएसपी.NET पृष्ठ "सिल्वरलाइट ऐप" होस्टिंग से वर्तमान एएसपी.NET उपयोगकर्ता नाम "इंजेक्शन" करने का सुझाव देता है। सिल्वरलाइट एप्लिकेशन में क्लाइंट की मशीन के संदर्भ में चलने से पहले ही। बेशक, यहां तक ​​कि यदि यह काम करता है, तो यह आपको केवल एएसपी.NET के रूपों या विंडोज आधारित प्रमाणीकरण और से क्लाइंट मशीन के उपयोगकर्ता पर लॉग इन किए गए विंडोज उपयोगकर्ता नाम से एएसपी.NET उपयोगकर्ता नाम देगा।

+0

अच्छा जवाब wihtout प्राप्त कर सकते हैं! यदि संभवतः कोई रचनात्मक उत्तर नहीं होगा (हैक?) – huseyint

0

इस के अनुसार जावास्क्रिप्ट में अपनी संभव नहीं पोस्ट, तो मैं भाग्य के अपने बाहर लगता है: http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts

लगता है वहाँ यह करने के लिए कोई वास्तविक तरीका है की तरह।

+0

असल में हम जावास्क्रिप्ट समाधान के लिए जाते हैं, और यह काम करता है, तो मैं शायद (और दुर्भाग्य से) इस उत्तर को स्वीकार कर सकता हूं। लेकिन इसके लिए उपयोगकर्ता को सुरक्षा संवादों का एक समूह स्वीकार करने की आवश्यकता है जो आदर्श से बहुत दूर है। – huseyint

28

आप इस तरह से प्राप्त करने के लिए प्रबंधन कर सकते हैं।

1) एएसपीनेट वेब सेवा एप्लिकेशन बनाएं।

2) चांदी की आवेदक से कॉल करने के लिए वेब सेवा और विधि लागू करें।

[WebMethod] 
public string GetClientUserName() 
{ 
    return System.Web.HttpContext.Current.User.Identity.Name.ToString(); 
} 

3) वेब सर्वर पर इस वेब सेवा एप्लिकेशन को तैनात करें। अज्ञात उपयोगकर्ता को इसका उपयोग करने की अनुमति न दें।

4) इस सेवा को सिल्वरलाइट एप्लिकेशन में जोड़ें। (सेवा संदर्भ जोड़ें)

5) अब, आप इस विधि को कॉल कर सकते हैं और संपूर्ण चांदी के आवेदन से उपयोगकर्ता नाम प्राप्त कर सकते हैं।

+0

+1 काफी आसान है। ऐसा नहीं सोचा था कि यह स्मार्ट – christoph

+0

सिल्वरलाइट 5. – Roger

3

मुझे लगा कि मैं इस कोड को साझा करूंगा जो काम करने लगता है (वाईएमएमवी)। यह क्रेगटीपी के जवाब और उनके लिंक द्वारा प्रेरित है। मुझे पता है कि यह एक स्थिर वेब पेज में चलने के बारे में सीधे जवाब नहीं देता है, लेकिन ऐसा लगता है कि ओपी ने एपीएसएक्स समझौता स्वीकार कर लिया है।

मेरी ASPX पेज कि Silverlight को होस्ट में:

<head> 
    <!-- ...snip... --> 
    <script runat="server" language="c#"> 
    void Page_Load() 
    { 
     this.UsernameField.Value = User.Identity.Name; 
    }   
    </script> 
</head> 
<body> 
    <input type="hidden" ID="UsernameField" runat="server" /> 
    <!-- ...snip... --> 
</body> 

मेरी Silverlight सी # कोड में:

private string GetCurrentUserName() 
{ 
    HtmlDocument doc = HtmlPage.Document; 

    if (doc == null) 
    { 
     return string.Empty; 
    } 

    HtmlElement elm = doc.GetElementById("UsernameField"); 

    if (elm == null) 
    { 
     return string.Empty; 
    } 

    return elm.GetAttribute("value"); 
} 
+2

के साथ मेरे लिए काम नहीं करता है, ऐसा लगता है कि यह काम करेगा, आप एसएसओ प्रमाणीकरण जैसे सुरक्षा के लिए इस तंत्र पर भरोसा नहीं कर सकते हैं। – Thorarin

+0

@ थोरिनिन: यह विंडोज/नेगोशिएट या एनटीएलएम (जो मुझे एसएसओ के लिए लगता है) प्रमाणीकरण या यहां तक ​​कि बेसिक के लिए ठीक काम करेगा। हम यहां के बारे में बात कर रहे हैं उपयोगकर्ता नाम को सिल्वरलाइट क्लाइंट में वापस ले रहा है। सिल्वरलाइट में इस जानकारी के साथ कोई क्या करता है कुछ हद तक संदिग्ध है। किसी भी प्रकार का प्रमाणीकरण/प्रमाणीकरण कार्य आम तौर पर सर्वर पर किया जाता है - एसएसपी जब एसएल इतनी सैंडबॉक्स होती है। हालांकि, मैं ओपी को ऐसा नहीं करने के लिए कहूंगा क्योंकि हम पूरी कहानी नहीं जानते हैं। इसके अलावा, ओपी रचनात्मक हैक्स की तलाश में प्रतीत होता है। – Aardvark

7

अत्यधिक इस प्रश्न के उत्तरों मतदान मेरी मदद नहीं की।

एक ASP.NET वेब सेवा का उपयोग करना, यह फिर भी काम किया:

string userName = 
    System.ServiceModel.ServiceSecurityContext.Current.WindowsIdentity.Name; 

और इस ब्लॉग प्रविष्टि एक है कि मुझे सही पथ के लिए तैयार है:

http://rouslan.com/2009/03/12/20-steps-to-get-together-windows-authentication-silverlight-and-wcf-service/

ServiceReferences.ClientConfig इसकी आवश्यकता है:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding ...> 
      <security mode="TransportCredentialOnly" /> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

और web.config आवश्यकता इस:

<system.web> 
    <authentication mode="Windows" /> 
    <identity impersonate="false" /> 
    </system.web> 

    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding ...> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    </system.serviceModel> 

उन केवल उल्लेखनीय परिवर्तन मैं एक अन्यथा काम कर Silverlight अनुप्रयोग है कि पहले से IIS में वेब सेवाओं के लिए अनाम पहुंच का इस्तेमाल किया करने के लिए बनाने के लिए आवश्यक हैं।

+0

+1 'system.web' अनिवार्य है! इसे हाइलाइट करने के लिए धन्यवाद ... – Legend

+0

@ माइकल मैडॉक्स - आपका लिंक टूटा हुआ था, मैं आगे बढ़ गया और इसे अपडेट किया। –

2
Environment 
    .GetFolderPath(Environment.SpecialFolder.Personal) 
    .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2]; 
+0

रनटाइम त्रुटि: एक्सेस अस्वीकृत। –

0

// कोड मेवरिक जवाब का एक छोटा सा सुधार का उपयोग कर System.IO.Path.DirectorySeparatorChar बल्कि // तो //

पर्यावरण .GetFolderPath (Environment.SpecialFolder.Personal) .Split (नई [] {System.IO.Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries) [2];