diff --git a/models/auth/source.go b/models/auth/source.go
index bade2fecf0..0a904b7772 100644
--- a/models/auth/source.go
+++ b/models/auth/source.go
@@ -317,7 +317,14 @@ func UpdateSource(source *Source) error {
 		}
 	}
 
-	_, err := db.GetEngine(db.DefaultContext).ID(source.ID).AllCols().Update(source)
+	has, err := db.GetEngine(db.DefaultContext).Where("name=? AND id!=?", source.Name, source.ID).Exist(new(Source))
+	if err != nil {
+		return err
+	} else if has {
+		return ErrSourceAlreadyExist{source.Name}
+	}
+
+	_, err = db.GetEngine(db.DefaultContext).ID(source.ID).AllCols().Update(source)
 	if err != nil {
 		return err
 	}
diff --git a/routers/web/admin/auths.go b/routers/web/admin/auths.go
index d2953f753d..6ebd23b7bb 100644
--- a/routers/web/admin/auths.go
+++ b/routers/web/admin/auths.go
@@ -426,9 +426,11 @@ func EditAuthSourcePost(ctx *context.Context) {
 	source.IsActive = form.IsActive
 	source.IsSyncEnabled = form.IsSyncEnabled
 	source.Cfg = config
-	// FIXME: if the name conflicts, it will result in 500: Error 1062: Duplicate entry 'aa' for key 'login_source.UQE_login_source_name'
 	if err := auth.UpdateSource(source); err != nil {
-		if oauth2.IsErrOpenIDConnectInitialize(err) {
+		if auth.IsErrSourceAlreadyExist(err) {
+			ctx.Data["Err_Name"] = true
+			ctx.RenderWithErr(ctx.Tr("admin.auths.login_source_exist", err.(auth.ErrSourceAlreadyExist).Name), tplAuthEdit, form)
+		} else if oauth2.IsErrOpenIDConnectInitialize(err) {
 			ctx.Flash.Error(err.Error(), true)
 			ctx.Data["Err_DiscoveryURL"] = true
 			ctx.HTML(http.StatusOK, tplAuthEdit)