2016-07-17 4 views
5

에 MVC 웹 API ID (OWIN 보안)를 사용하여 인증 된 MVC 및 웹 API 프로젝트가 있습니다. 확인 이메일이없는 사용자가 ASP.NET MVC 웹 API ID (OWIN 보안)

나는 제대로 작동 Register 기능에 대한 확인 이메일을 추가했지만 이 암시의, 어떤 웹 API 신원에 명시 적 로그인 기능이 있기 때문에 나는 로그인하기 전에 emailConfirmed = true 있는지 확인하는 방법을 잘 모르겠어요 없습니다.

Microsoft는 인증 기능을 깊이 캡슐화 할 좋은 이유가 있음을 알고 있지만이를 달성 할 방법이없는 것은 알고 있습니까?

알려 주시기 바랍니다. 연구의 많은 내가 대답을 발견 한 후

[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

웹 API에 토큰 기반 인증을 사용합니다. 토큰을 사용하여 요청을 사용자 계정과 연관시킬 수 있습니다. 일단 토큰을 통해 사용자를 확인하면 MVC에서와 마찬가지로'user.emailconfirmed'에 액세스 할 수 있습니다 – Nkosi

+0

토큰을 사용하여 완벽하게 작동하는 로그인 기능이 있습니다. 내 질문에 'user.emailconfirmed 'ID 2에 로그인 기능이 없으므로 암시 적입니다. – user3378165

+0

로그인 기능의 일부 여야합니다. 그렇지 않으면 항상 인증 파일러에서 확인할 수 있습니다. – Nkosi

답변

8

:

이 내 등록 기능입니다. ApplicationOAuthProvider.cs 클래스의 GrantResourceOwnerCredentials 기능으로

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

(공급자 폴더 아래) :

나는 검사 다음 코드를 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

간단히'if (! user.EmailConfirmed)'대신'var userid = userManager.FindByEmail (context.UserName) .Id;'와'if (! userManager.IsEmailConfirmed (userid))'를 수행하면 어떤 이점이 있습니까? –

관련 문제