2016-07-17 119 views
5

I progetti MVC e Web API sono autenticati utilizzando l'identità dell'API Web MVC di ASP.NET (OWIN Security).Impedisci agli utenti senza email confermata di accedere all'identità dell'API Web MVC di ASP.NET (OWIN Security)

ho aggiunto una mail di conferma alla funzione Register che funziona correttamente, ma non sono sicuro come controllare se emailConfirmed = true prima di accedere perché non v'è una funzione di login esplicito sul Web API Identità, è implicita.

So che Microsoft ha una buona ragione per incapsulare profondamente la funzionalità di autorizzazione, ma non c'è un modo per raggiungerlo?

Si prega di avvisare.

Questa è la mia funzione di Registrazione:

[AllowAnonymous] 
[Route("Register")] 
public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     var user = new ApplicationUser() { UserName = model.Email, Email = model.Email }; 

     IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 

     try 
     { 
      var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 

      var callbackUrl = new Uri(Url.Link("ConfirmEmailRoute", new { userId = user.Id, code = code })); 

      var email = new Email(); 
      email.To = user.Email; 
      email.From = "[email protected]"; 
      email.Subject = "Please confirm your account"; 
      email.Body = "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>"; 

      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      var data = JsonConvert.SerializeObject(email); 

      WebClient client = new WebClient(); 
      client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); 
      var resp = client.UploadString(@"http:...", data); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.ToString()); 
     } 
     return Ok(); 
    } 
+0

Utilizzare l'autenticazione basata su token per web api. utilizzando il token è possibile associare una richiesta con un account utente. una volta verificato l'utente tramite il token, puoi accedere a 'user.emailconfirmed' proprio come faresti in MVC – Nkosi

+0

Ho la funzionalità di accesso che funziona perfettamente usando il token, la mia domanda è dove dovrei aggiungere il controllo di- se' user.emailconfirmed 'perché non c'è una funzione di login sull'identità 2, è implicita .. – user3378165

+0

Dovrebbe essere parte della tua funzionalità di accesso. Altrimenti puoi sempre controllarlo in un file di autenticazione – Nkosi

risposta

8

Dopo un sacco di ricerche ho trovato la risposta.

ho aggiunto il seguente codice che controlla se l'emailconfirmed = true:

var userid = userManager.FindByEmail(context.UserName).Id; 
     if (!userManager.IsEmailConfirmed(userid)) 
     { 
      context.SetError("invalid_grant", "Email registration wasn't confirmed."); 
      return; 
     } 

Per la funzione GrantResourceOwnerCredentials nella classe ApplicationOAuthProvider.cs (nella cartella Provider).

Questo è l'intera funzione:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

     ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 
     ////Added code here 
     var userid = userManager.FindByEmail(context.UserName).Id; 
     if (!userManager.IsEmailConfirmed(userid)) 
     { 
      context.SetError("invalid_grant", "Email registration wasn't confirmed."); 
      return; 
     } 
     //// 
     ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, 
      OAuthDefaults.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, 
      CookieAuthenticationDefaults.AuthenticationType); 

     AuthenticationProperties properties = CreateProperties(user.UserName); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    } 

che funziona perfettamente e impedisce all'utente di accedere in prima confermato l'email di registrazione.

+1

Qualsiasi vantaggio nel fare 'var userid = userManager.FindByEmail (context.UserName) .Id;' then 'if (! UserManager.IsEmailConfirmed (userid))' invece di semplicemente 'if (! User.EmailConfirmed)'? –