Es posible conseguir el iniciado en nombre de usuario del usuario con Silverlight? Usted puede suponer que el usuario tiene el sistema operativo Windows y la aplicación de Silverlight está alojado en Internet Explorer. Obtención de la identidad desde el lado del servidor con ASP.NET no es una opción, esta aplicación de Silverlight será alojado en un archivo HTML estático.

InformationsquelleAutor huseyint | 2009-07-24

8 Comentarios

  1. 27

    Por desgracia, yo no creo que sea posible.

    Aunque usted dice que podemos asumir Windows OS/IE, Silverlight sí mismo, ciertamente no asumir esto, por lo que la mayoría de la normal .NETO de los mecanismos que normalmente sería disponibles para nosotros para conseguir la sesión actual del usuario nombre no existen dentro del subconjunto de marco disponible para aplicaciones de Silverlight:

    es decir.

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

    están disponibles dentro de una aplicación de Silverlight, mientras que en (por ejemplo) una Aplicación de Windows Forms, cada uno de estos mecanismos está disponible para su uso.

    Supongo que tiene sentido, realmente, ya que no hay ninguna garantía de que la aplicación de Silverlight que se va a ejecutar en la parte superior de un Windows/IE plataforma.

    Por cierto, esta pregunta también fue preguntado por aquí:

    Nombre de Usuario de Windows y Dominio de

    y que el hilo parece confirmar que no hay ningún nativo para lograr esto. El hilo se va a plantear «inyectar» el actual ASP.NET nombre de usuario de la ASP.NET la página de «hosting» de la aplicación de Silverlight. en la aplicación de Silverlight a sí mismo antes de que se ejecute en el contexto de la máquina del cliente. Por supuesto, incluso si esto funciona, sólo te dará la ASP.NET nombre de usuario de cualquiera de las ASP.NET’s formas o basado en windows para la autenticación y no el nombre de usuario de Windows del usuario que ha iniciado sesión de la máquina cliente.

    • Bonita respuesta! Probablemente (y por desgracia) marca esta respuesta aceptada si no va a ser creativos respuesta (hack?)
  2. 28

    Usted puede llegar a obtener por esta vía.

    1) Crear asp.net aplicación de servicio web.

    2) Implementar el servicio web y el método para llamar desde la aplicación de silverlight.

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

    3) Implementar esta aplicación de servicio web en el servidor web. No permitir que los usuarios anónimos acceder a este.

    4) Añadir este servicio a la aplicación Silverlight. (Agregar referencia de servicio)

    5) Ahora, usted puede llamar a este método y obtener el nombre de usuario de toda la aplicación de silverlight.

    • +1 muy fácil. Había pensado que va a ser tan inteligente
    • No me funciona con Silverlight 5.
  3. 7

    La muy votado respuestas a esta pregunta no me ayudan.

    El uso de un ASP.NET servicio web, esto funcionó sin embargo:

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

    Y esta entrada de blog es el que me puso en el camino correcto:

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

    ServiceReferences.ClientConfig necesidades de este:

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

    Y web.config necesidades de este:

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

    Esos son los únicos cambios notables tuve que hacer para un trabajo de la aplicación de Silverlight que anteriormente utilizaban el acceso anónimo para los servicios web en IIS.

    • +1 El system.web es obligatorio! Gracias por elegirlo…
    • Su enlace estaba roto, me fui por delante y actualizado.
  4. 3

    Pensé que me gustaría compartir este código, que parece que funciona (YMMV). Es inspirado por CraigTP la respuesta y sus vínculos se proporcionan. Sé que esto no contesta directamente a la parte sobre la que se ejecuta en una página web estática, pero parece que el OP aceptado la APSX compromiso.

    En mi página ASPX que aloja 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>

    En mi silverlight de código de 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");
     }
    • Mientras que esto parece que se va a trabajar, no se puede confiar en este mecanismo de seguridad, como la autenticación SSO.
    • Esto funciona muy bien para Windows/Negociar o NTLM (lo que yo creo que de para SSO) o de la autenticación Básica. Todo de lo que estamos hablando aquí es conseguir el nombre de usuario de vuelta al cliente de Silverlight. Lo que se hace con esta información en Silverlight es algo dudosa. Cualquier tipo de autenticación/autorización de trabajo se realiza normalmente en el servidor – esp cuando SL es tan de espacio aislado. Sin embargo, yo no voy a decir que el OP no hacerlo ya que no sabemos toda la historia. Además, el OP parece estar buscando creativa hacks.
  5. 2
    Environment
        .GetFolderPath(Environment.SpecialFolder.Personal)
        .Split(new[] { '\' }, StringSplitOptions.RemoveEmptyEntries)[2];
    • Error de tiempo de ejecución: Acceso denegado.
  6. 0

    //una pequeña mejora de Código Maverick respuesta usando el Sistema.IO.Ruta de acceso.DirectorySeparatorChar lugar //entonces //

    Medio ambiente
    .GetFolderPath(Medio Ambiente.SpecialFolder.Personal)
    .Split(new[] { Sistema.IO.Ruta de acceso.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries)[2];

Dejar respuesta

Please enter your comment!
Please enter your name here