2016-07-17 26 views
5

Tôi có một MVC và một dự án API web, được xác thực bằng ASP.NET MVC Web API Identity (OWIN Security).Ngăn người dùng không có email xác nhận đăng nhập vào ASP.NET MVC Web API Identity (OWIN Security)

tôi đã thêm một email xác nhận đến Register chức năng hoạt động đúng nhưng tôi không chắc chắn làm thế nào để kiểm tra xem emailConfirmed = true trước khi đăng nhập vì không có là một chức năng Login rõ ràng về nhận dạng Web API, nó tiềm ẩn.

Tôi biết Microsoft có lý do hợp lý để đóng gói sâu chức năng ủy quyền, nhưng không có cách nào để đạt được điều đó?

Vui lòng thông báo.

Đây là chức năng Đăng ký của tôi:

[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

Sử dụng xác thực dựa trên mã thông báo cho api web. bằng cách sử dụng mã thông báo, bạn có thể liên kết yêu cầu với tài khoản người dùng. khi bạn xác minh người dùng thông qua mã thông báo, bạn có thể truy cập 'user.emailconfirmed' giống như bạn làm trong MVC – Nkosi

+0

Tôi có chức năng đăng nhập hoạt động hoàn hảo bằng mã thông báo, câu hỏi của tôi là nơi tôi nên thêm kiểm tra- nếu' user.emailconfirmed 'bởi vì không có chức năng đăng nhập trên danh tính 2, nó ngầm định .. – user3378165

+0

Nó phải là một phần của chức năng đăng nhập của bạn. Nếu không, bạn luôn có thể kiểm tra nó trong bộ lọc xác thực – Nkosi

Trả lời

8

Sau rất nhiều nghiên cứu tôi đã tìm thấy câu trả lời.

tôi đã thêm đoạn mã sau để kiểm tra nếu emailconfirmed = true:

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

Đối với GrantResourceOwnerCredentials chức năng trong lớp ApplicationOAuthProvider.cs (trong thư mục Provider).

Đây là toàn bộ chức năng:

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

đó làm việc một cách hoàn hảo và ngăn chặn người dùng đăng nhập trước khi ông xác nhận email đăng ký.

+1

Bất kỳ lợi ích nào khi thực hiện 'var userid = userManager.FindByEmail (context.UserName) .Id;' rồi 'if (! UserManager.IsEmailConfirmed (userid))' thay vì đơn giản 'if (! User.EmailConfirmed)'? –

Các vấn đề liên quan