2017-04-03 25 views
6

Tôi có một AccountController cho trang web của Api web của tôi có sử dụng các cài đặt mặc định cho lần đăng nhập:Chống giả mạo Mã Web Api 2

// POST: /Account/Login 
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    // This doesn't count login failures towards account lockout 
    // To enable password failures to trigger account lockout, change to shouldLockout: true 
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
    switch (result) 
    { 
     case SignInStatus.Success: 
      return RedirectToLocal(returnUrl); 
     case SignInStatus.LockedOut: 
      return View("Lockout"); 
     case SignInStatus.RequiresVerification: 
      return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
     case SignInStatus.Failure: 
     default: 
      ModelState.AddModelError("", "Invalid login attempt."); 
      return View(model); 
    } 
} 

này hoạt động tốt cho các trang web, nhưng nếu tôi đang sử dụng một khách hàng ứng dụng như UWP hoặc Xamarin điều này trở thành vấn đề nếu tôi muốn đăng nhập mà không sử dụng WebView vì có vẻ như Web Api được kết hợp với web vì nó dựa trên mã thông báo anti-forgery được tạo trong Chế độ xem và đăng lại khi gửi. Giả sử tôi muốn ứng dụng khách đó chỉ sử dụng hộp văn bản và nút gửi để đăng nhập giống như hầu hết các ứng dụng dành cho thiết bị di động tôi thấy. Chúng thường không bật lên một số WebView.

Giải pháp duy nhất để tạo một phương pháp khác đăng nhập vào người dùng mà không có mã thông báo chống giả mạo? Điều đó có vẻ hơi lộn xộn và không tuân theo các nguyên tắc DRY rất tốt, chưa kể đến một nguy cơ bảo mật tiềm tàng.

+2

Thực hiện GET của trang đăng nhập và lấy được dấu hiệu, sau đó làm POST của bạn đến trang đăng nhập, đang được bảo đảm để gửi lại các dấu hiệu bạn có. –

Trả lời

1

Câu trả lời cho điều này là bỏ qua mã thông báo chống giả mạo hoàn toàn bằng cách thực hiện POST tới điểm cuối/mã thông báo và ghi đè ApplicationOAuthProvider để cho phép truy cập ứng dụng khách. Xem stackexchange này để biết chi tiết:

WebAPI [Authorize] returning error when logged in

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