8

Ho impostato un server di autorizzazione OWIN e diversi server di risorse che espongono le API Web ASP.NET. Sto scontando un JWT dal server di autorizzazione specifico per ogni server di risorse (l'idea è che ogni server di risorse ha bisogno di attestazioni personalizzate racchiuse nel suo token).Utilizzare l'autenticazione di Windows con OAuth 2.0

Questi server si trovano tutti in un ambiente intranet in cui storicamente abbiamo utilizzato l'autenticazione di Windows (Kerberos) per fornire un'esperienza di single sign-on. Questa funzionalità è stata persa nella mia implementazione perché sto utilizzando il nome utente e la password dell'utente (autenticati con AD) per concedere un token. Quello che mi chiedo è se c'è un modo per ottenere un'esperienza di single sign-on, magari usando l'autenticazione di Windows per stabilire l'identità di un utente prima di concedergli un token?

Mi sembra che questo non sia abbastanza ortodosso e potrebbe essere stupido, quindi, per favore, dimmi se esiste un approccio alternativo migliore per ottenere SSO con OAuth 2.0 in un ambiente intranet.

risposta

5

Alla fine, non è stato così difficile come mi aspettavo. Ho creato un controller API Web standard su un endpoint alternativo (/token/windows/). Questo endpoint accetta un POST HTTP con l'ID client (risorsa) a cui l'utente Windows sta tentando di connettersi. Inserisco l'attributo standard [Authorize] sull'azione per garantire che l'identità sia stabilita, quindi creo manualmente un'identità di attestato e restituisco un JWT all'utente. Da quel punto l'utente utilizza il processo di aggiornamento del token standard.

Modifica: ecco un esempio di seguito che rappresenta ciò che ho implementato. Si noti che questa applicazione sia configurato in IIS per supportare l'autenticazione di Windows (in aggiunta a autenticazione anonima):

[RoutePrefix("token/windows")] 
public class WindowsAuthenticationController : ApiController 
{ 
    [Authorize] 
    [HttpPost] 
    [Route("{client_id}"] 
    public async Task<IHttpActionResult> CreateTokenForWindowsIdentity(string client_id) 
    { 
     var user = User as ClaimsPrincipal; 
     if (user == null) return Unauthorized(); //401 
     var claims = //generate claims based on the User.Identity.Name... 
     var identity = new ClaimsIdentity("JWT"); 
     identity.AddClaims(claims); 

     //manually create JWT using whatever method you prefer, 
     //I used something inspired from http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/ 
    } 
} 
+0

Avete un esempio di codice, o tutti i link per mostrare come questo è stato fatto? –

+2

Questo non ha senso ... –

+0

Joshua, il server di autorizzazione e il server delle risorse sono uguali o diversi? Se si sta eseguendo un server delle risorse basato sui ruoli, spostando l'attributo [Autorizza] si entrerebbe in conflitto con ciò che è configurato per il consumo di token. Quando chiami "CreateTokenForWindowsIdentity", si aspetterebbe che la richiesta abbia un token valido a causa di questo attributo Authorize. Come hai architettato il tuo server di risorse e autenticazione per ottenere sia l'autenticazione di Windows che l'autenticazione basata su token? Thx – nav