2016-07-17 9 views
5

में लॉगिंग से पुष्टि किए गए ईमेल के बिना उपयोगकर्ताओं को रोकें मेरे पास एक एमवीसी और एक वेब एपीआई प्रोजेक्ट है, जो एएसपी.नेट एमवीसी वेब एपीआई पहचान (ओविन सुरक्षा) का उपयोग करके प्रमाणीकृत है।एएसपी.नेट एमवीसी वेब एपीआई पहचान (ओविन सुरक्षा)

मैं Register समारोह है कि ठीक से काम करता करने के लिए एक ईमेल पुष्टि जोड़ा है, लेकिन मैं प्रवेश करने के पहले अगर emailConfirmed = true जाँच करने के लिए कैसे सुनिश्चित करें कि कोई वेब एपीआई पहचान पर एक स्पष्ट लॉग इन समारोह है वहाँ क्योंकि, यह अंतर्निहित है नहीं कर रहा हूँ।

मुझे पता है कि माइक्रोसॉफ्ट के पास प्रमाणीकरण कार्यक्षमता को गहराई से encapsulate करने का एक अच्छा कारण है, लेकिन यह हासिल करने का कोई तरीका नहीं है?

कृपया सलाह दें।

यह मेरा रजिस्टर समारोह है:

[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

वेब एपीआई के लिए टोकन आधारित प्रमाणीकरण का उपयोग करें। टोकन का उपयोग करके आप उपयोगकर्ता खाते के साथ अनुरोध जोड़ सकते हैं। एक बार जब आप उपयोगकर्ता को टोकन के माध्यम से सत्यापित करते हैं तो आप 'user.emailconfirmed' तक पहुंच सकते हैं जैसे कि आप एमवीसी – Nkosi

+0

में लॉग इन कार्यक्षमता है जो टोकन का उपयोग करके पूरी तरह से काम करता है, मेरा सवाल यह है कि मैं कहां से जोड़ूं- अगर 'user.emailconfirmed 'क्योंकि पहचान 2 पर लॉगिन फ़ंक्शन नहीं है, यह अंतर्निहित है .. – user3378165

+0

यह आपकी लॉगिन कार्यक्षमता का हिस्सा होना चाहिए। अन्यथा आप इसे हमेशा प्रमाणीकरण फाइलर – Nkosi

उत्तर

8

के बाद शोध का एक बहुत मैं इस सवाल का जवाब मिल गया है।

var userid = userManager.FindByEmail(context.UserName).Id; 
     if (!userManager.IsEmailConfirmed(userid)) 
     { 
      context.SetError("invalid_grant", "Email registration wasn't confirmed."); 
      return; 
     } 
ApplicationOAuthProvider.cs कक्षा में GrantResourceOwnerCredentials समारोह के लिए

(प्रदाता फ़ोल्डर के अंतर्गत):

मैं निम्नलिखित कोड है कि जाँच करता है, तो emailconfirmed = true गयी।

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

कि पूरी तरह से काम करता है और उपयोगकर्ता में प्रवेश करने से पहले वह पंजीकरण ईमेल की पुष्टि करने से रोकता है:

इस पूरी कार्य है।

+1

'var userid = userManager.FindByEmail (context.UserName) करने के लिए कोई लाभ। आईडी; 'फिर' अगर (! UserManager.IsEmailConfirmed (userid)) 'बस (! User.Email पुष्टि की गई)' के बजाय'? –

संबंधित मुद्दे