2015-07-20 38 views
17

Sono nuovo di ASP.NET MVC 5 e sto trovando molto scomodo con l'autenticazione di identità + framework di autorizzazione. So che questa è una nuova funzionalità del framework ASP.NET MVC, quindi mi piacerebbe applicare un modo alternativo per implementare l'autenticazione in un'applicazione.Autenticazione cookie OWIN senza identità ASP.NET

È possibile? Ho letto che potrei usare lo FormsAuthenticationModule. Questa è una buona alternativa? Come posso usarlo in un'applicazione basata su MVC 5?

+0

Il punto del framework di autenticazione OWin è che è completamente modulare. Basta eseguire 'Install-Package Microsoft.Owin.Security.Cookies' e installarlo sul tuo' IAppBuilder'. – Aron

+0

Perché non vuoi usare Identity? OWIN è un nuovo modo di iniettare la tua autenticazione. Se non ti piace, crea il tuo modulo OWIN e immetti quello? L'identità è il nuovo modo di autenticare gli utenti. Se non ti piace l'intero pezzo di autenticazione sociale, non usarlo. FormsAuthentication è un modo, ma vecchio. –

+0

gentilmente controlla la mia risposta qui: http://stackoverflow.com/questions/26485575/ potrebbe aiutarti – Monah

risposta

20

Mi sono sentito allo stesso modo quando ho dato un'occhiata a Identity. Aggiunge molte astrazioni inutili e non è adatto al mio caso se dispongo di un sistema legacy che implementa il flusso di lavoro dell'autenticazione personalizzata.

Tonnellate di esempi sull'autenticazione OWIN che utilizzano Identità ed EF per impostazione predefinita, il che rende gli sviluppatori confusi che OWIN debba utilizzare Identity ed Entity Framework.

Ma tecnicamente, è possibile rimuovere Identità per utilizzare solo l'autenticazione cookie OWIN (Microsoft.Owin.Security.Cookies). Il codice risulta molto semplice, qui di seguito è l'esempio che ho avuto da mio codice che elimina le cose banali:

[HttpPost] 
public ActionResult Login(LoginViewModel model, string returnUrl) 
{ 
    var user = _userService.GetByEmail(model.Email); 

    //check username and password from database, naive checking: 
    //password should be in SHA 
    if (user != null && (user.Password == model.Password)) 
    { 
     var claims = new[] { 
       new Claim(ClaimTypes.Name, user.Name), 
       new Claim(ClaimTypes.Email, user.Email), 
       // can add more claims 
      }; 

     var identity = new ClaimsIdentity(claims, "ApplicationCookie"); 

     // Add roles into claims 
     var roles = _roleService.GetByUserId(user.Id); 
     if (roles.Any()) 
     { 
      var roleClaims = roles.Select(r => new Claim(ClaimTypes.Role, r.Name)); 
      identity.AddClaims(roleClaims); 
     } 

     var context = Request.GetOwinContext(); 
     var authManager = context.Authentication; 

     authManager.SignIn(new AuthenticationProperties 
       { IsPersistent = model.RememberMe }, identity); 

     return RedirectToAction("Index", "Home"); 
    } 
    // login failed.    
} 

public ActionResult LogOut() 
{ 
    var ctx = Request.GetOwinContext(); 
    var authManager = ctx.Authentication; 

    authManager.SignOut("ApplicationCookie"); 
    return RedirectToAction("Login"); 
} 
+0

grazie ragazzo, questo è semplicemente perfetto! ma ... ho bisogno di gestire i ruoli per gli utenti, è possibile utilizzare il tuo approccio? – davioooh

+0

@davioooh: sì, in grado di gestire ruoli come le autenticazioni dei moduli, ho aggiornato il mio codice per aggiungere più ruoli nelle rivendicazioni –

+1

Perfetto! Molte grazie! – davioooh

1

senza utilizzare Owin Metodi di protezione: Coding Itz mio controller

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(Employee emp, string returnUrl) 
      { 
      using(AdaptiveProjectEntities db = new AdaptiveProjectEntities()) 
      { 
       string email = emp.Email; 
       // byte[] en = System.Text.Encoding.UTF8.GetBytes(emp.Password); 
       //var ee = Convert.ToBase64String(en); 
       string pass = emp.Password; 

       bool userValid = db.Employees.Any(user => user.Email == email && user.Password == pass); 
        if(userValid) 
        { 
         FormsAuthentication.SetAuthCookie(email, false); 



         if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 

        return RedirectToAction("Index", "Projects"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
        } 



      return View(emp); 

     } 
     public ActionResult Logout() 
     { 
      FormsAuthentication.SignOut(); 
      return RedirectToAction("Login", "Login"); 
     } 
    } 
} 

Vista:

<div class="container" style="margin-right:50%"> 
    <div class="row"> 
     <div class="col-md-12 col-md-offset-7" style="bottom:-250px"> 
      <div class="panel panel-default" style="margin-right:15%"> 
       <div class="panel-heading" style="padding-bottom:5%"> 

        <center><h3 style="margin-right:80px">Login</h3></center> 
        @*</div>*@ 
        @using (Html.BeginForm()) 
        { 
         <div class="modal-body"> 

          @Html.AntiForgeryToken() 

          <div class="form-horizontal" style="margin-right: 10%;"> 
           @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 


           <div class="form-group"> 
            @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-3" }) 
            <div class="col-md-9"> 
             @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control", type = "email", required = "required" } }) 
             @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" }) 
            </div> 
           </div> 
           <div class="form-group"> 
            @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-3" }) 
            <div class="col-md-9"> 
             @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", type = "password", required = "required" } }) 
             @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" }) 
            </div> 
           </div> 

          </div> 
          <div> 
           <input class="btn btn-primary pull-left col-lg-offset-1" type="submit" value="Login" style="margin-left:35%" /> 
          </div> 

         </div> 


        } 
       </div> 
      </div> 
     </div> 
     </div> 
    </div> 
    </div> 
Problemi correlati