2009-07-24 16 views
20

Ist es möglich, den Benutzernamen des derzeit angemeldeten Benutzers bei Silverlight abzurufen? Sie können davon ausgehen, dass der Benutzer über ein Windows-Betriebssystem verfügt und die Silverlight-Anwendung in Internet Explorer gehostet wird. Es ist keine Option, die Identität von der Serverseite mit ASP.NET abzurufen. Diese Silverlight-Anwendung wird in einer statischen HTML-Datei gehostet.Abrufen des aktuellen Windows-Benutzernamens in Silverlight

Antwort

27

Leider glaube ich nicht, dass es möglich ist.

Obwohl Sie sagen, dass wir Windows OS/IE annehmen können, nimmt Silverlight selbst dies natürlich nicht an, also tun die meisten der normalen .NET-Mechanismen, die uns normalerweise zur Verfügung stehen würden, den aktuell angemeldeten Benutzernamen nicht in der Teilmenge des für Silverlight-Apps verfügbaren Frameworks vorhanden:

dh.

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

sind alle nicht zur Verfügung innerhalb einer Silverlight-Anwendung, während in (sagen wir) eine Windows Forms-Anwendung, wobei jeder dieser Mechanismen zu nutzen, zur Verfügung steht.

Ich denke, es macht Sinn, wirklich, da es keine Garantie gibt, dass die Silverlight-Anwendung auf einer Windows/IE-Plattform ausgeführt wird.

Übrigens wurde diese Frage auch hier gefragt über:

Current Windows Username and Domain

und dieser Thread scheint zu bestätigen, dass es keine native Möglichkeit, dies zu erreichen. Der Thread schlägt dann vor, den aktuellen ASP.NET-Benutzernamen von der ASP.NET-Seite "einzubinden", die die Silverlight-App "hostet". in die Silverlight-Anwendung selbst, bevor sie im Kontext des Client-Computers ausgeführt wird. Selbst wenn dies funktioniert, erhalten Sie nur den ASP.NET-Benutzernamen aus der Forms oder Windows-basierten Authentifizierung von ASP.NET und den Windows-Benutzernamen des derzeit angemeldeten Benutzers des Client-Computers.

+0

Nizza Antwort zu bekommen! Ich werde wahrscheinlich (und leider) diese Antwort als akzeptiert markieren, wenn es keine kreative Antwort geben wird (hack?) – huseyint

0

nach Dieser Beitrag ist es nicht möglich, in JavaScript, so dass ich denke, dass Ihr kein Glück: http://bytes.com/topic/javascript/answers/616501-how-get-windows-username-using-javascripts

klingt wie es keine wirkliche Möglichkeit, es zu tun ist.

+0

Eigentlich haben wir uns zunächst für eine JavaScript-Lösung entschieden, und es hat funktioniert. Aber es erfordert, dass der Benutzer eine Reihe von Sicherheitsdialogen akzeptiert, die alles andere als ideal sind. – huseyint

28

Sie können es schaffen, auf diese Weise zu bekommen.

1) Erstellen Sie ASP.net Web-Service-Anwendung.

2) Implementieren Sie den Webservice und die Methode zum Aufrufen von Silverlight-Anwendungen.

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

3) Stellen Sie diese Web-Service-Anwendung auf dem Webserver bereit. Lassen Sie keinen anonymen Benutzer darauf zugreifen.

4) Fügen Sie diesen Dienst der Silverlight-Anwendung hinzu. (Service-Referenz hinzufügen)

5) Jetzt können Sie diese Methode aufrufen und Benutzernamen aus der gesamten Silverlight-Anwendung abrufen.

+0

+1 ziemlich einfach. Hätte nicht gedacht, dass es so intelligent sein wird – christoph

+0

Funktioniert bei mir nicht mit Silverlight 5. – Roger

3

Ich dachte, ich würde diesen Code teilen, der zu funktionieren scheint (YMMV). Es ist inspiriert von CraigTPs Antwort und seinen Links, die er zur Verfügung gestellt hat. Ich weiß, dass dies nicht direkt den Teil über das Laufen auf einer statischen Webseite beantwortet, aber es scheint, dass das OP den APSX-Kompromiss akzeptiert hat.

In meiner ASPX-Seite, die Silverlight-Gastgeber:

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

In meinem Silverlight-C# -Code:

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

Während dies so aussieht, wird es funktionieren, Sie können sich nicht auf diesen Mechanismus für die Sicherheit verlassen, wie SSO-Authentifizierung. – Thorarin

+0

@Thorarin: Dies würde für Windows/Negotiate oder NTLM (was ich denke für SSO) Authentifizierung oder sogar Basic gut funktionieren. Alles, worüber wir hier reden, ist, den Benutzernamen zurück zum Silverlight-Client zu bekommen. Was man mit dieser Information in Silverlight macht, ist etwas zweifelhaft. Jede Art von Authentifizierungs-/Autorisierungsarbeit wird typischerweise auf dem Server ausgeführt - insbesondere wenn SL so sandboxed ist. Aber ich werde dem OP nicht sagen, dass er das nicht tun soll, da wir die ganze Geschichte nicht kennen. Außerdem scheint das OP nach kreativen Hacks Ausschau zu halten. – Aardvark

7

Die hoch Antworten stimmten auf diese Frage nicht mir geholfen hat.

eine ASP.NET Web-Service, arbeitete dies jedoch:

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

Und dieser Blog-Eintrag ist derjenige, der mich auf dem richtigen Weg gesetzt:

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

ServiceReferences.ClientConfig benötigt dies:

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

Und web.config brauchen s dies:

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

Diejenigen, die einzigen nennenswerten Veränderungen sind ich zu einer ansonsten arbeitet Silverlight-Anwendung zu machen, erforderlich, die zuvor die anonymen Zugriff für Web-Dienste in IIS verwendet.

+0

+1 Das 'system.web' ist obligatorisch! Danke für die Hervorhebung ... – Legend

+0

@MichaelMaddox - Ihr Link war kaputt, ich ging voran und aktualisierte es. –

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

Laufzeitfehler: Zugriff verweigert. –

0

// eine kleine Verbesserung der Codes Maverick Antwort mit System.IO.Path.DirectorySeparatorChar eher // dann //

Umwelt .GetFolderPath (Environment.SpecialFolder.Personal) .split (neu [] {System.IO.Path.DirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries) [2];

Verwandte Themen