2016-07-17 8 views
5

Mam projekty MVC i web API, uwierzytelniane przy użyciu ASP.NET MVC Web API Identity (OWIN Security).Uniemożliwianie użytkownikom bez potwierdzonego adresu e-mail logowania się w ASP.NET MVC Web API Identity (OWIN Security)

dodałem potwierdzenie e-mail do funkcji Register który działa poprawnie, ale nie jestem pewien, jak sprawdzić, czy emailConfirmed = true przed zalogowaniem się, ponieważ nie ma to wyraźny Logowanie funkcja Web API na tożsamość, to niejawna.

Wiem, że Microsoft ma dobry powód, aby głęboko enkapsulować funkcję autoryzacji, ale czy nie ma sposobu, aby to osiągnąć?

Prosimy o radę.

To jest moja funkcja Rejestracja:

[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

Uwierzytelnianie oparte na tokenach dla interfejsu API. przy użyciu tokena można powiązać żądanie z kontem użytkownika. gdy zweryfikujesz użytkownika za pomocą tokena, możesz uzyskać dostęp do 'user.emailconfirmed', tak jak w MVC – Nkosi

+0

Mam funkcjonalność logowania, która działa idealnie za pomocą tokena, moje pytanie brzmi: gdzie powinienem dodać kontrolę- jeśli' user.emailconfirmed 'ponieważ nie ma funkcji logowania na tożsamości 2, jest to niejawne .. – user3378165

+0

To powinno być częścią twojej funkcji logowania. W przeciwnym razie możesz zawsze sprawdzić to w filtrze uwierzytelniającym. – Nkosi

Odpowiedz

8

Po wielu badaniach znalazłem odpowiedź.

I dodaje następujący kod, który sprawdza, czy emailconfirmed = true:

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

do funkcji w klasie ApplicationOAuthProvider.csGrantResourceOwnerCredentials (w folderze operatora).

To jest cała funkcja:

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); 
    } 

To działa doskonale i uniemożliwia użytkownikowi zalogowanie się przed potwierdził email rejestracyjny.

+1

Jakiekolwiek korzyści dla 'var userid = userManager.FindByEmail (context.UserName) .Id;' then 'if (! UserManager.IsEmailConfirmed (userid))' zamiast po prostu 'if (! User.EmailConfirmed)'? –

Powiązane problemy