2015-01-23 31 views
14

Mi è stato assegnato l'incarico di modificare un'applicazione ASP.NET MVC in modo tale che la navigazione in myurl? Username = xxxxxx possa automaticamente accedere all'utente xxxxxx, senza chiedere password.ASP.NET MVC Login identità senza password

Ho già chiarito che questa è una pessima idea per molti motivi e scenari legati alla sicurezza, ma i responsabili sono determinati. Il sito non sarebbe disponibile al pubblico.

Quindi: esiste un modo di accedere senza password, ad esempio estendendo Microsoft.AspNet.Identity.UserManager e modificando AccountController?

Alcuni codice:

var user = await _userManager.FindAsync(model.UserName, model.Password); 
        if (user != null && IsAllowedToLoginIntoTheCurrentSite(user)) 
        { 
         user = _genericRepository.LoadById<User>(user.Id); 
         if (user.Active) 
         { 
          await SignInAsync(user, model.RememberMe); 

_userManager detiene un'istanza di un Microsoft.AspNet.Identity.UserManager.

e SignInAsync():

private async Task SignInAsync(User user, bool isPersistent) 
    { 
     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
     var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 
     if (user.UserGroupId.IsSet()) 
      user.UserGroup = await _userManager.Load<UserGroup>(user.UserGroupId); 

     //adding claims here ... // 

     AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, new CustomClaimsIdentity(identity)); 
    } 

AuthenticationManager sarebbe OwinSecurity.

+0

Mostraci il tuo 'codice login' :) –

+1

... e, naturalmente, nessuna azienda ha mai problemi con le minacce interne * cough * * cough * Snowden. Per quanto riguarda la tua domanda, sì, è facile. Rendere le cose meno sicure lo è sempre. Sarei tentato di impostare la password di tutti su una stringa vuota e usarla implicitamente (veloce e sporco, ma funzionerà e renderà anche il punto che la tua sicurezza non vale nulla allo stesso tempo). Se vuoi farlo "correttamente", puoi sottoclassi i provider di autenticazione – Basic

+0

@AndyRefuerzo: Ho aggiunto codice rilevante. – Bjorn

risposta

36

Hai solo bisogno di utilizzare il usermanager per trovare l'utente per nome. Se si dispone di un record poi semplicemente accedere.

public ActionResult StupidCompanyLogin() 
    { 

     return View(); 
    } 

    [HttpPost] 
    //[ValidateAntiForgeryToken] - Whats the point? F**k security 
    public async Task<ActionResult> StupidCompanyLogin(string name) 
    { 

     var user = await UserManager.FindByNameAsync(name); 

     if (user != null) 
     { 

      await SignInManager.SignInAsync(user, true, true); 
     } 

     return View(); 
    } 
+16

Fantastici nomi di azioni! –

+0

In realtà ha funzionato, ho pensato che sarebbe stato più di una seccatura. Grazie per aver aiutato un principiante. Per qualche ragione non sono felice di scavare questo buco di sicurezza. – Bjorn

+0

Nessun problema: assicurati di coprire le spalle al lavoro! – heymega

Problemi correlati