2016-07-17 17 views
5

ASP.NET MVC Web API Kimliği (OWIN Güvenliği) kullanılarak kimliği doğrulanmış bir MVC ve bir web API projeleri var. ASP.NET MVC Web API Kimliği (OWIN Güvenliği) oturum açma e-postası tarafından onaylanmadan kullanıcıların önlenmesi

düzgün çalıştığını Register işlevine onay e-postası eklendi ama o örtük, hiç Web API Kimlik üzerinde açık bir Girişi işlevi yoktur çünkü giriş yapmadan önce emailConfirmed = true olmadığını kontrol etmek emin değilim.

Microsoft'un yetkilendirme işlevini derinlemesine saklamak için iyi bir nedeni olduğunu biliyorum, ancak bunu başarmanın bir yolu yok mu?

Lütfen bildiriniz. araştırmalarda bir çok cevabı bulduk sonra

[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

Web api için jeton tabanlı kimlik doğrulama kullanın. jetonu kullanarak bir isteği bir kullanıcı hesabıyla ilişkilendirebilirsiniz. Bir kez kullanıcı ile belirteci doğrulayın Eğer daha sonra MVC – Nkosi

+0

içinde olduğu gibi 'user.emailconfirmed' erişebilirsiniz Ben iyi kullanarak çalışır giriş işlevselliği var, benim soru nereye-check-in user.emailconfirmed eklemek gerekir Çünkü kimlik 2'de oturum açma fonksiyonu yoktur, dolayısı ile örtülüdür .. – user3378165

+0

Oturum açma işlevinizin bir parçası olmalıdır. Aksi takdirde, bir kimlik doğrulama denetleyicisinde ( – Nkosi

cevap

8

:

Bu benim Kayıt fonksiyonudur. ApplicationOAuthProvider.cs sınıfında GrantResourceOwnerCredentials fonksiyonu için

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

(Sağlayıcı klasörünün altında):

Ben denetler aşağıdaki kodu emailconfirmed = true eğer eklendi. mükemmel çalışıyor ve o kayıt e doğruladı önce oturum açmasını engeller

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

:

Tüm bu fonksiyondur.

+1

Yapmak için herhangi bir fayda var userid = userManager.FindByEmail (context.UserName) .Id; 'sonra' if (! UserManager.IsEmailConfirmed (userid)) '' yerine '' ((user.EmailConfirmed) 'if? –