خانه/ وبلاگ/ Login Failed for User
SQL Server

رفع مشکل Login Failed for User در SQL Server

عیب‌یابی ۲۵ مرداد ۱۴۰۴ ۱۰ دقیقه مطالعه

اگر هنگام اتصال به SQL Server از طریق SSMS یا هر برنامه‌ی دیگری با پیام Login failed for user '...' روبه‌رو شده‌ای، خبر خوب این است که این یکی از رایج‌ترین و قابل‌رفع‌ترین خطاهای SQL Server است. در این راهنما قدم‌به‌قدم علت اصلی خطا را پیدا می‌کنیم و آن را هم از طریق SSMS (رابط گرافیکی) و هم با T-SQL رفع می‌کنیم.

این خطا معمولاً با کد Error: 18456 همراه است. مهم‌ترین سرنخ برای پیدا کردن علت واقعی، عدد State است که در ادامه توضیح می‌دهیم.

خطای Login Failed for User یعنی چه؟

این خطا زمانی رخ می‌دهد که SQL Server هویت کاربری که قصد اتصال دارد را تأیید نمی‌کند. به زبان ساده، سرور می‌گوید: «کسی که پشت این نام‌کاربری/رمزعبور یا این حساب ویندوزی ایستاده، مجاز به ورود نیست.» این خطا می‌تواند در سطح Login (احراز هویت در سطح سرور) یا در مرحله‌ی نگاشت آن Login به یک User در پایگاه‌داده‌ی مقصد رخ دهد.

مهم‌ترین دلایل بروز این خطا

  • نام کاربری یا رمز عبور اشتباه است — ساده‌ترین و رایج‌ترین علت.
  • SQL Server Authentication (Mixed Mode) فعال نیست — سرور فقط روی Windows Authentication تنظیم شده و اجازه‌ی ورود با نام‌کاربری/رمزعبور را نمی‌دهد.
  • خودِ Login غیرفعال (Disabled) شده — یک مدیر سیستم آن را دستی غیرفعال کرده است.
  • حساب قفل شده (Locked Out) — بعد از چند بار تلاش ناموفق پیاپی، در صورت فعال بودن Policy قفل‌شدن حساب.
  • رمز عبور منقضی شده — با فعال بودن Enforce Password Expiration.
  • Login به هیچ User ای در پایگاه‌داده‌ی مقصد نگاشت نشده — Login معتبر است، اما اجازه‌ی ورود به آن پایگاه‌داده‌ی خاص را ندارد.
  • اتصال از سرور/برنامه‌ای با Trusted Connection اشتباه — مثلاً برنامه سعی می‌کند با Windows Authentication وصل شود، درحالی‌که سرور روی SQL Authentication تنظیم شده.

رمزگشایی از عدد State در پیام خطا

وقتی خطا را در SQL Server Error Log می‌بینی (نه در پیام کلاینت، چون به دلایل امنیتی جزئیات کامل فقط در لاگ سرور ثبت می‌شود)، یک عدد State کنار آن هست که دقیقاً علت را مشخص می‌کند:

Stateمعنی
State 5Login (نام کاربری) اصلاً وجود ندارد.
State 8رمز عبور اشتباه وارد شده است.
State 7 / 11 / 12Login معتبر است، اما دسترسی رد شده (مثلاً غیرفعال بودن یا محدودیت سطح دسترسی).
State 13سرویس SQL Server در حال Shutdown است.
State 18رمز عبور منقضی شده و باید تغییر کند.
State 38 / 40خطا در دسترسی به پایگاه‌داده‌ی پیش‌فرض تعریف‌شده برای آن Login.

برای دیدن این عدد باید Error Log سرور را از مسیر SSMS → Management → SQL Server Logs باز کنی؛ خودِ کلاینت (مثلاً پیام خطای SSMS) این جزئیات را نشان نمی‌دهد.

راهنمای تصویری رفع مشکل در SSMS

در ادامه رایج‌ترین سناریو را قدم‌به‌قدم در SQL Server Management Studio رفع می‌کنیم: فعال‌سازی Mixed Mode Authentication، فعال‌کردن یک Login قفل‌شده یا غیرفعال، تنظیم مجدد رمز عبور، و نگاشت آن به یک پایگاه‌داده.

مرحله ۱ — بررسی و فعال‌سازی SQL Server Authentication

ابتدا در Object Explorer، روی نام سرور راست‌کلیک کن و Properties را بزن، سپس صفحه‌ی Security را باز کن:

Server Properties — Security
Server authentication
Windows Authentication mode
SQL Server and Windows Authentication mode انتخاب کن
بعد از تغییر این تنظیم، باید سرویس SQL Server (MSSQLSERVER) را از SQL Server Configuration Manager یا services.msc ری‌استارت کنی تا تغییر اعمال شود؛ در غیر این‌صورت خطا همچنان ادامه دارد.

مرحله ۲ — بررسی وضعیت Login (فعال/غیرفعال، قفل‌شده)

مسیر: Object Explorer → Security → Logins، روی Login موردنظر راست‌کلیک کن و Properties را انتخاب کن، سپس به تب Status برو:

Login Properties — ali_app — Status
Permission to connect to database engine ● Grant
Login is locked out ○ No (غیرفعال چون Not Locked)
Login ● Enabled

اگر گزینه‌ی Login is locked out فعال بود یا وضعیت Login روی Disabled بود، همین‌جا آن را به Enabled تغییر بده و OK را بزن.

مرحله ۳ — تنظیم مجدد رمز عبور (در صورت نیاز)

در همان پنجره‌ی Properties، به تب General برگرد و رمز جدید را در دو فیلد Password و Confirm password وارد کن. اگر Policy رمز عبور شرکت فعال است، تیک Enforce password policy را برحسب نیاز تنظیم کن.

مرحله ۴ — نگاشت Login به یک User در پایگاه‌داده

در تب User Mapping، پایگاه‌داده‌ی موردنظر را تیک بزن تا SQL Server یک User متناظر برایش بسازد، و در بخش پایین، نقش‌های (Role) لازم مثل db_datareader یا db_datawriter را انتخاب کن:

Login Properties — ali_app — User Mapping
ShopDB
AdventureWorks
Database role membership for: ShopDB
db_datareader
db_datawriter
db_owner
اگر این مرحله را رد کنی، Login می‌تواند به سرور وصل شود اما همچنان با خطای دسترسی (نه لزوماً 18456، بلکه خطای «cannot access the database») به پایگاه‌داده‌ی خاص روبه‌رو خواهد شد. جزئیات کامل رابطه‌ی Login و User را در درس Users بخوان.

رفع مشکل با T-SQL

اگر ترجیح می‌دهی به‌جای رابط گرافیکی مستقیم از کوئری استفاده کنی، همه‌ی مراحل بالا معادل T-SQL هم دارند:

sql
-- فعال کردن یک Login غیرفعال
ALTER LOGIN ali_app ENABLE;

-- تنظیم مجدد رمز عبور (بدون بررسی رمز قبلی)
ALTER LOGIN ali_app WITH PASSWORD = N'N3wStr0ngP@ss!';

-- خارج کردن Login از حالت قفل‌شده (Unlock)
ALTER LOGIN ali_app WITH PASSWORD = N'N3wStr0ngP@ss!' UNLOCK;

-- ساخت User متناظر در پایگاه‌داده‌ی مقصد و نگاشت به Login
USE ShopDB;
CREATE USER ali_app FOR LOGIN ali_app;

-- دادن دسترسی خواندن به آن User
ALTER ROLE db_datareader ADD MEMBER ali_app;

چک‌لیست سریع عیب‌یابی

بررسی کنمسیر
نام کاربری/رمز عبور درست است؟وارد کردن مجدد و دقت به Caps Lock
Mixed Mode Authentication فعال است؟Server Properties → Security
سرویس بعد از تغییر Authentication ری‌استارت شده؟SQL Server Configuration Manager
Login فعال (Enabled) و قفل‌نشده است؟Login Properties → Status
Login به پایگاه‌داده‌ی مقصد نگاشت شده؟Login Properties → User Mapping
عدد State در Error Log چیست؟Management → SQL Server Logs

جمع‌بندی

خطای Login failed for user تقریباً همیشه یکی از این چند علت را دارد: اطلاعات ورود اشتباه، غیرفعال‌بودن SQL Authentication، غیرفعال یا قفل‌بودن خودِ Login، یا نبودِ نگاشت به یک User در پایگاه‌داده‌ی مقصد. با نگاه‌کردن به عدد State در Error Log و دنبال‌کردن مراحل بالا، تقریباً همیشه می‌توانی این مشکل را در کمتر از چند دقیقه رفع کنی.

برای درک عمیق‌تر مفاهیم امنیتی SQL Server، درس‌های Logins، Users، Roles و Permissions را در دوره‌ی SQLFarsi دنبال کن.

می‌خوای مفاهیم امنیت SQL Server را کامل یاد بگیری؟

فصل امنیت دوره‌ی SQLFarsi، Login، User، Role و Permission را از پایه توضیح می‌دهد.

شروع فصل امنیت