2009-09-10 5 views
6

Ho creato un sistema di accesso personalizzato per la mia applicazione Web asp.net mvc 1.0 mentre memorizzo grandi quantità di dati utente per ciascun utente (ho deciso di non aggiungere tabelle personalizzate per Windows autenticazione a causa di questo). Il sistema di login utilizza fondamentalmente SQL Server (2005 o 2008) e il mio database e la struttura della tabella che è piuttosto standard. Una tabella utenti con ID univoco, nome utente e password con hash che sono collegati alle altre tabelle dei dati relativi all'utente.Autenticazione di Windows con ASP.NET MVC

La mia domanda è, come posso legare il mio sistema per utilizzare gli accessi di autenticazione di Windows. Vorrei consentire all'amministratore di un utente (come definito nel mio sistema) selezionare un login di autenticazione di Windows e magari aggiungere un valore a qualcosa nella mia tabella personalizzata che posso utilizzare per autenticarli?

La domanda è probabilmente formulata in modo errato e potrei aver frainteso il modo in cui l'autenticazione di Windows funziona, ma mi piacerebbe offrire l'opzione nella mia applicazione web.

+0

Non conosco la risposta esatta ma: penso che per lavorare con Windows auth bisognerebbe impostare la directory attiva e avere un utente per ogni persona sulla rete. Quindi penso che devi impersonare l'utente di asp.net usando il web.config e dovresti essere pronto. – rball

risposta

8

se avete Windows Auth attivato sul vostro sito allora si dovrebbe essere in grado di utilizzare User.Identity.Name per ottenere il loro/Active Directory NT nome utente dell'utente attualmente connesso e confrontarlo con una colonna nella tabella utenti.

+0

Quindi, utilizzando il mio actionfilter HttpContext.Current.User.Identity.Name, posso accedere al mio nome utente (MACHINE \ PHIL) e IsAuthenticated è impostato. Quindi tutto ciò che devo fare è aggiungere un'altra colonna alla mia tabella utente per associare il mio nome utente a User.IDentity.Name e controllare che siano autentificati? – Phil

+1

Se User.Identity.Name restituisce un valore, essi sono autenticati. E più al punto che non dovrebbero essere in grado di accedere alla pagina a meno che non siano autenticati (IIS li costringerà a authenitcate prima di renderizzare la pagina). – Scrappydog

1

Se sto capendo correttamente la tua domanda, vuoi aggiungere altri dati collegati a un nome utente autenticato da Windows?

Se è così, sarà necessario memorizzare il nome utente e queste informazioni personalizzate in una nuova tabella. I dati di autenticazione di Windows sono presenti in Active Directory in modo tale da poterli visualizzare per ottenere un elenco di utenti. Non otterrai automaticamente le informazioni personalizzate aggiunte ad AD quando Windows autentica l'utente. Se desideri informazioni personalizzate dovrai aggiungere una ricerca personalizzata in AD o semplicemente cercare i dati personalizzati nel tuo database in base a dove decidi di memorizzare le informazioni.

Praticamente tutto ciò che ottieni con l'autenticazione di Windows è il nome utente dell'utente e la possibilità di controllare i ruoli (gruppi di annunci) associati a quell'utente. Qualunque cosa al di là di ciò, dovrai effettuare manualmente il codice.

Ho chiesto di recente di implementare la personalizzazione oltre la sicurezza integrata in MVC e ho trovato una soluzione per conto mio. Forse c'è qualche utile suggerimento che potrebbero aiutare a rispondere alla tua domanda:

How to implement authorization checks in ASP.NET MVC based on Session data?

+0

Commento utile, qualche buona lettura di sottofondo e altre idee. – Phil

8

Ecco come lo abbiamo fatto per un ibrido forme/autenticazione di Windows app: -

public class MyBaseController 
{ 
    protected override void OnAuthorization(AuthorizationContext authContext) 
    { 
    if 
    (
     !User.Identity.IsAuthenticated && 
     Request.LogonUserIdentity != null && 
     Request.LogonUserIdentity.IsAuthenticated 
    ) 
    { 
     String logonUserIdentity = Request.LogonUserIdentity.Name; 
     if (!String.IsNullOrEmpty(logonUserIdentity)) 
     { 
     User loginUser = 
      Context.Users.FirstOrDefault(
      x => x.UserIdentity == logonUserIdentity); 
     if (loginUser != null) 
      FormsAuthentication.SetAuthCookie(
      loginUser.LoginName,createPersistentCookie); 
    } 
    } 

C'è un po 'di incapsulamento che ho preso per il bene di compattezza.

+0

Grazie per l'utile snippet di codice! :) – Phil

+0

Iain, ti dispiacerebbe postare più del codice?Sono interessato a incapsulare correttamente questa funzionalità E come hai configurato IIS (sto usando IIS 7 da solo). Grazie. – wgpubs