2009-07-24 19 views
20

E 'possibile 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'identità dal lato server con ASP.NET non è un'opzione, questa applicazione Silverlight sarà ospitata su un file HTML statico.Ottieni il nome utente corrente di Windows in Silverlight

risposta

27

Purtroppo, non penso sia possibile.

Sebbene si dica che possiamo assumere Windows OS/IE, Silverlight stesso non lo presuppone, quindi la maggior parte dei normali meccanismi .NET che sarebbero normalmente disponibili per ottenere il nome utente connesso corrente non esistono all'interno del sottoinsieme del framework disponibile per le app Silverlight:

ie.

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

sono tutti disponibili all'interno di un'applicazione Silverlight, mentre in (diciamo) un'applicazione Windows Form, ciascuno 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, questa domanda è stato anche chiesto qui:

Current Windows Username and Domain

e quel filo sembra confermare che non c'è modo nativo per raggiungere questo obiettivo. 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. Naturalmente, 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.

+0

Nizza risposta! Probabilmente (e purtroppo) contrassegnerò questa risposta come accettata se non ci sarà alcuna risposta creativa (hack?) – huseyint

28

Si può arrivare 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) Aggiungere questo servizio all'applicazione Silverlight. (Aggiungi riferimento servizio)

5) Ora è possibile chiamare questo metodo e ottenere il nome utente dall'intera applicazione Silverlight.

+0

+1 abbastanza facile. Non avevo pensato che fosse così intelligente – christoph

+0

Non funziona per me con Silverlight 5. – Roger

3

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:

<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> 

Nel mio Silverlight codice 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"); 
} 
+2

Mentre sembra che funzioni, non è possibile fare affidamento su questo meccanismo per motivi di sicurezza, come l'autenticazione SSO. – Thorarin

+0

@Thorarin: Funzionerebbe bene per l'autenticazione Windows/Negotiate o NTLM (cosa penso di SSO) o anche di base. Tutto quello di cui stiamo parlando qui riporta il nome utente al client Silverlight. Quello che si fa con queste informazioni in Silverlight è in qualche modo discutibile. Qualsiasi tipo di lavoro di autenticazione/autorizzazione viene in genere eseguito sul server, specialmente quando SL è così in modalità sandbox. Tuttavia, non ho intenzione di dire all'OP di non farlo poiché non conosciamo l'intera storia. Inoltre, l'OP sembra essere alla ricerca di hack creativi. – Aardvark

7

Il altamente votato risposte a questa domanda non mi ha aiutato.

L'utilizzo di un servizio Web ASP.NET, questo ha funzionato comunque:

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

E questo 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:

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

E web.config bisogno s questo:

<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> 

Quelli sono gli unici cambiamenti degni di nota avevo bisogno di fare a un'applicazione Silverlight altrimenti di lavoro che ha usato in precedenza l'accesso anonimo per i servizi Web in IIS.

+0

+1 Il 'system.web' è obbligatorio! Grazie per averlo evidenziato ... – Legend

+0

@MichaelMaddox - Il tuo link è stato rotto, sono andato avanti e l'ho aggiornato. –

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

Errore di runtime: accesso negato. –

0

// un piccolo miglioramento del codice Maverick risposta utilizzando System.IO.Path.DirectorySeparatorChar piuttosto // // poi

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

Problemi correlati