Saltar al contenido

sdk/windows

SDK C# / .NET para aplicaciones WinUI 3 que usa WebView2 para autorización, PKCE S256 y IsolatedStorage protegido con DPAPI para persistencia de tokens.

Ver como Markdown

Estado

El estado del paquete es Implementado y verificado localmente. La suite multiplataforma de pruebas unitarias de .NET se ejecuta correctamente. WebView2, DPAPI, WinUI 3 y un recorrido de ida y vuelta con un IdP real aún requieren un entorno de integración de Windows. Esta página documenta el comportamiento implementado; no afirma que esté listo para producción.

Estado del registro: UNPUBLISHED. Instala este SDK únicamente desde el checkout del código fuente del repositorio; no uses un registro de paquetes externo.

Requisitos

  • .NET 8 y Windows App SDK 1.6+
  • WebView2 Runtime (Evergreen: preinstalado con Microsoft Edge)
  • La aplicación debe establecer <UseWinUI>true</UseWinUI> en el archivo de proyecto

Instalación

Añade una ProjectReference al checkout del código fuente desde el archivo de proyecto de tu aplicación:

<ItemGroup>
  <ProjectReference Include="../xid/sdk/windows/Xid.Windows.csproj" />
</ItemGroup>

Inicio rápido

using Xid.Windows;

// 1. Configure in App.xaml.cs OnLaunched.
XidClient.Shared.Configure(new XidConfiguration
{
    Issuer      = new Uri("https://xid.dev"),
    ClientId    = "your_client_id",
    RedirectUri = "com.example.myapp://auth/callback",
    // Scopes default: openid profile email. offline_access is rejected until DPoP is implemented.
});

// 2. Sign in (opens embedded WebView2 window)
XidSession session = await XidClient.Shared.SignInAsync();
Console.WriteLine($"Signed in: {session.User.Email}");

// 3. Get the current unexpired access token. Expiry requires reauthorization.
string? token = await XidClient.Shared.GetAccessToken();

// 4. Get the current unexpired session.
XidSession? current = await XidClient.Shared.GetSession();

// 5. Clear local state.
await XidClient.Shared.SignOut();

Callback de esquema URI personalizado (opcional)

Si usas una redirección de esquema URI personalizado en lugar de la ventana embebida de WebView2, reenvía la URI de activación del protocolo a HandleRedirectAsync:

// App.xaml.cs
protected override void OnActivated(IActivatedEventArgs args)
{
    if (args.Kind == ActivationKind.Protocol)
    {
        var protocolArgs = (ProtocolActivatedEventArgs)args;
        await XidClient.Shared.HandleRedirectAsync(protocolArgs.Uri);
    }
}

API principal

Método Descripción
Configure(XidConfiguration) Inicializa el SDK. Llámalo una sola vez al arrancar la aplicación.
SignInAsync(options?, ct) Abre una ventana de autorización WebView2 embebida con PKCE S256. Devuelve XidSession al completarse.
HandleRedirectAsync(Uri, ct) Procesa un callback de esquema URI personalizado e intercambia el código de autorización.
GetSession(ct) Devuelve la sesión actual no caducada, borra el estado local caducado y devuelve null.
GetAccessToken(options?, ct) Devuelve el token de acceso actual no caducado; ForceRefresh borra la sesión y exige volver a autorizar.
SignOut(ct) Limpia los tokens de sesión locales del IsolatedStorage protegido con DPAPI.
SetTokenStorage(ITokenStorage) Reemplaza el DpapiTokenStorage predeterminado con una implementación personalizada de ITokenStorage.

Adaptador de almacenamiento

El almacenamiento predeterminado cifra los tokens con DPAPI (ámbito CurrentUser) y los persiste en IsolatedStorage. Implementa ITokenStorage para usar Windows Hello o el Administrador de credenciales:

public sealed class MyCustomStorage : ITokenStorage
{
    public Task SaveAsync(StoredTokenSet tokens, CancellationToken ct = default) { ... }
    public Task<StoredTokenSet?> LoadAsync(CancellationToken ct = default) { ... }
    public Task ClearAsync(CancellationToken ct = default) { ... }
}
XidClient.Shared.SetTokenStorage(new MyCustomStorage());

Dependencias

Paquete Versión Propósito
Microsoft.WindowsAppSDK 1.6.250228002 Host WinUI 3 y embedding de WebView2
Microsoft.Web.WebView2 1.0.3065.39 Ventana de autorización embebida basada en Chromium
System.Security.Cryptography.ProtectedData 8.0.0 Cifrado de tokens en reposo con DPAPI

Seguridad

  • Cliente público: no se almacena ni transmite ningún secreto de cliente.
  • Solo PKCE S256. El servidor rechaza el método plain de challenge.
  • Tokens cifrados con DPAPI (ámbito CurrentUser) y almacenados en IsolatedStorage. No accesibles para otras cuentas de usuario de Windows.
  • Estado OAuth generado por solicitud; validado en la redirección para prevenir CSRF.

Limitaciones conocidas

  • El WebView2 Runtime debe estar presente. El soporte de WebAuthenticationBroker como reserva está planificado pero aún no implementado.
  • La verificación de ID token basada en JWKS y el cierre de sesión end_session están implementados y probados localmente. Las pruebas reales de Windows WebView2, DPAPI e IdP siguen siendo necesarias para L4.
  • DpapiTokenStorage no funciona en plataformas distintas a Windows. Usa otra implementación de ITokenStorage al compilar de forma cruzada.
Navegación

Escribe para buscar...

Usa las flechas para navegarPulsa Intro para seleccionarPulsa Escape para cerrar