Ottieni il nome utente corrente di Windows in Silverlight

È ansible ottenere il nome utente dell’utente attualmente connesso con Silverlight? Si può presumere che l’utente abbia il SO Windows e l’applicazione Silverlight sia ospitata in Internet Explorer. Ottenere l’id quadro dal lato server con ASP.NET non è un’opzione, questa applicazione Silverlight sarà ospitata su un file HTML statico.

Sfortunatamente, non penso sia ansible.

Sebbene tu dica che possiamo assumere Windows OS / IE, Silverlight stesso di certo non lo presume, quindi la maggior parte dei normali meccanismi .NET che sarebbero normalmente disponibili per ottenere il nome utente attualmente connesso non esiste all’interno del sottoinsieme del framework disponibile per le app Silverlight:

vale a dire.

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

non sono tutti disponibili in un’applicazione Silverlight, mentre in (diciamo) un’applicazione Windows Form, ognuno di questi meccanismi è disponibile per l’uso.

Suppongo che abbia senso, in realtà, poiché non c’è alcuna garanzia che l’applicazione Silverlight sia in esecuzione su una piattaforma Windows / IE.

Per inciso, anche questa domanda è stata posta qui:

Nome utente e dominio correnti di Windows

e quel thread sembra confermare che non esiste un modo nativo per raggiungere questo objective. Il thread prosegue suggerendo di “iniettare” il nome utente ASP.NET corrente dalla pagina ASP.NET “hosting” dell’app Silverlight. nell’applicazione Silverlight stessa prima dell’esecuzione nel contesto del computer del client. Ovviamente, anche se funziona, verrà fornito solo il nome utente ASP.NET dai moduli di ASP.NET o dall’autenticazione basata su Windows e non il nome utente di Windows dell’utente attualmente connesso al computer client.

Puoi riuscire a cavarcanvas in questo modo.

1) Creare l’applicazione del servizio Web asp.net.

2) Implementare il servizio web e il metodo per chiamare dall’applicazione Silverlight.

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

3) Distribuire questa applicazione di servizio Web sul server Web. Non consentire all’utente anonimo di accedere a questo.

4) Aggiungi questo servizio all’applicazione Silverlight. (Aggiungi riferimento al servizio)

5) Ora puoi chiamare questo metodo e ottenere il nome utente dall’intera applicazione Silverlight.

Le risposte altamente votate a questa domanda non mi hanno aiutato.

Utilizzando un servizio Web ASP.NET, questo ha funzionato tuttavia:

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

E questo post di blog è quello che mi ha impostato sul percorso corretto:

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

ServiceReferences.ClientConfig ha bisogno di questo:

           

E web.config ha bisogno di questo:

                 

Queste sono le uniche modifiche degne di nota che dovevo apportare a un’applicazione Silverlight altrimenti funzionante che in precedenza utilizzava l’accesso anonimo per i servizi Web in IIS.

Ho pensato di condividere questo codice che sembra funzionare (YMMV). Si ispira alla risposta di CraigTP e ai suoi collegamenti forniti. So che questo non risponde direttamente alla parte relativa all’esecuzione in una pagina Web statica, ma sembra che l’OP abbia accettato il compromesso APSX.

Nella mia pagina ASPX che ospita Silverlight:

         

Nel mio codice Silverlight C #:

  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"); } 
 Environment .GetFolderPath(Environment.SpecialFolder.Personal) .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)[2]; 

secondo questo post non è ansible in javascript, quindi penso che la tua sfortuna: http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts

sembra che non ci sia un vero modo per farlo.

// un piccolo miglioramento della risposta di Maverick del codice usando System.IO.Path.DirectorySeparatorChar piuttosto // then //

Ambiente .GetFolderPath (Environment.SpecialFolder.Personal) .Split (new [] {System.IO.Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries) [2];