diff --git a/modules/user/user.go b/modules/user/user.go
index b9911e6f52..af49d7b06a 100644
--- a/modules/user/user.go
+++ b/modules/user/user.go
@@ -4,10 +4,29 @@
 
 package user
 
-import "os"
+import (
+	"os"
+	"os/user"
+	"runtime"
+	"strings"
+)
 
 // CurrentUsername return current login OS user name
 func CurrentUsername() string {
+	userinfo, err := user.Current()
+	if err != nil {
+		return fallbackCurrentUsername()
+	}
+	username := userinfo.Username
+	if runtime.GOOS == "windows" {
+		parts := strings.Split(username, "\\")
+		username = parts[len(parts)-1]
+	}
+	return username
+}
+
+// Old method, used if new method doesn't work on your OS for some reason
+func fallbackCurrentUsername() string {
 	curUserName := os.Getenv("USER")
 	if len(curUserName) > 0 {
 		return curUserName
diff --git a/modules/user/user_test.go b/modules/user/user_test.go
index d7df151531..51f10dbbd2 100644
--- a/modules/user/user_test.go
+++ b/modules/user/user_test.go
@@ -2,21 +2,40 @@ package user
 
 import (
 	"os"
+	"os/exec"
+	"runtime"
+	"strings"
 	"testing"
 )
 
-func TestCurrentUsername(t *testing.T) {
-	os.Setenv("USER", "")
-	os.Setenv("USERNAME", "foobar")
-
-	user := CurrentUsername()
-	if user != "foobar" {
-		t.Errorf("expected foobar as user, got: %s", user)
+func getWhoamiOutput() (string, error) {
+	output, err := exec.Command("whoami").Output()
+	if err != nil {
+		return "", err
 	}
+	return strings.TrimSpace(string(output[:])), nil
+}
 
-	os.Setenv("USER", "gitea")
+func TestCurrentUsername(t *testing.T) {
+	user := CurrentUsername()
+	if len(user) <= 0 {
+		t.Errorf("expected non-empty user, got: %s", user)
+	}
+	// Windows whoami is weird, so just skip remaining tests
+	if runtime.GOOS == "windows" {
+		t.Skip("skipped test because of weird whoami on Windows")
+	}
+	whoami, err := getWhoamiOutput()
+	if err != nil {
+		t.Errorf("failed to run whoami to test current user: %f", err)
+	}
 	user = CurrentUsername()
-	if user != "gitea" {
-		t.Errorf("expected gitea as user, got: %s", user)
+	if user != whoami {
+		t.Errorf("expected %s as user, got: %s", whoami, user)
+	}
+	os.Setenv("USER", "spoofed")
+	user = CurrentUsername()
+	if user != whoami {
+		t.Errorf("expected %s as user, got: %s", whoami, user)
 	}
 }