Cơ sở dữ liệu Azure SQL Đăng nhập thất bại cho người dùng trong ứng dụng, nhưng hoạt động tốt trong SSMS


14

Tôi muốn dùng thử tính năng người dùng cơ sở dữ liệu chứa trên Azure SQL Database V12, nhưng tôi gặp vấn đề khi xác thực có vẻ kỳ lạ đối với tôi.

Tôi đã tạo ra một cơ sở dữ liệu được gọi là Classifier. Tôi đã thêm IP của mình vào các quy tắc tường lửa để tôi có thể kết nối với máy chủ db Azure từ SSMS trên máy trạm của mình. Khi tôi có thể kết nối thông qua SSMS để quản trị, tôi đã thử thêm người dùng bằng mật khẩu vào cơ sở dữ liệu, như sau:

CREATE USER classifier WITH PASSWORD='thepassword'

Tôi cũng đã thêm người dùng này vào vai trò người đọc và ghi dữ liệu:

exec sp_addrolemember 'db_datawriter', 'classifier'
exec sp_addrolemember 'db_datareader', 'classifier'

Sau này, tôi có thể kết nối với cơ sở dữ liệu với các thông tin đăng nhập từ SSMS:

nhập mô tả hình ảnh ở đây

Nhưng đây là lúc mọi thứ trở nên tồi tệ: Tôi đã thử một số câu thần chú chuỗi kết nối khác nhau và dường như không thể kết nối trong một ứng dụng web mà tôi đang làm việc. Nó không hoạt động trong môi trường Azure, vì vậy tôi đang chạy trên localhost với chuỗi kết nối đến cơ sở dữ liệu Azure và nó sẽ không kết nối. Đây là chuỗi kết nối tôi đang sử dụng tại thời điểm này:

<add name="Classifier" connectionString="Data Source=xxxxxxx.database.secure.windows.net;Initial Catalog=Classifier;User ID=classifier;Password=xxxxxxxxxxxxx;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient"/>

Tôi đã thử đặt lại mật khẩu (thông qua SSMS) cho người dùng và sau đó cập nhật chuỗi kết nối; Tôi cũng đã kiểm tra lại mật khẩu bằng cách sao chép nó ngay từ chuỗi kết nối này và vào hộp thoại kết nối trong SSMS để đảm bảo rằng tôi không có lỗi đánh máy nào đó ở đó.

Tôi đã kích hoạt kiểm toán trong máy chủ Azure Azure với hy vọng có được một số chi tiết về lý do tại sao nó không thành công, nhưng tất cả những gì tôi nhận được là:

Err 18456, Cấp 14, Trạng thái 1, SQL Azure nghiêm trọng, Dòng 1Login không thành công cho 'trình phân loại' của người dùng

Và đây là nơi tôi bị mắc kẹt. Hầu hết những gì tôi có thể tìm thấy bằng tài liệu hoặc blog chỉ ra rằng việc cần làm là xem nhật ký SQL Server để xem trạng thái lỗi thực sự sẽ cho thấy bản chất của sự thất bại hẹp hơn, nhưng vì tôi Tôi đang làm việc với Azure không có cách nào để làm điều đó (theo như tôi biết).

Điều gì có thể khiến ứng dụng thất bại khi SSMS (và LinqPad và Visual Studio Server Explorer, tình cờ) thành công?

Câu trả lời:


15

Chúng tôi thấy rằng với cơ sở dữ liệu chứa / người dùng có chứa, bạn phải chỉ định:

GRANT CONNECT TO [YOUR_USER]

Mặt khác CONNECTdường như bị thu hồi theo mặc định. Khi chúng tôi thực hiện thay đổi ở trên, chúng tôi có thể truy cập cơ sở dữ liệu.


Chúng tôi đã có một tài khoản hiện đang hoạt động và sau đó ngừng hoạt động. Tôi đã phải cấp kết nối một lần nữa với nó.
Shane Courtrille

Trên Azure, tôi gặp lỗi Cannot find the user 'myuser', because it does not exist or you do not have permission.mặc dù tên người dùng tồn tại trong Bảo mật> Đăng nhập nhưng không phải MyDatabse> Bảo mật> Người dùng. Tôi đã thử CREATE USER [myuser] FOR LOGIN [myuser] WITH DEFAULT_SCHEMA=[mydb] GOnhưng gặp lỗiThe login already has an account under a different user name.
Korayem

Tôi đã có một vấn đề tương tự. Trên môi trường dev mọi thứ hoạt động kết nối với sql Azure, nhưng một khi được xuất bản, nó sẽ đưa ra lỗi đó. Tuy nhiên tôi không thể chạy lệnh hoặc tạo người dùng, bất cứ ai đang thử đôi khi khác nhau?
Ricker Silva

@dezso Tôi đang đối mặt với vấn đề tương tự. Mã ADO.NET và EF (DBContext) của tôi hoạt động tốt trong máy cục bộ (chưa thử trong Azure) Nhưng mã EF được triển khai bằng IdentityDBConext không thành công. Tôi không chắc chắn những gì sai hoặc những tính năng của IdentityDBConext yêu cầu quyền truy cập vào máy chủ. Đây là câu hỏi ban đầu của tôi stackoverflow.com/questions/40260720/ trên
Hiren Desai

5

Khi chuyển API của chúng tôi để kết nối với cơ sở dữ liệu Azure thông qua người dùng có chứa mới, chúng tôi đã phải thay đổi chuỗi kết nối của mình để bao gồm:

Persist Security Info=True;

Mặc dù tôi không hiểu tại sao thay đổi này là bắt buộc, tôi muốn đăng ở đây trong trường hợp nó giúp người khác trong tương lai.

Chúng tôi ban đầu đã đến để thử điều này từ câu hỏi này .


2

Vấn đề của tôi là khác nhau, nhưng có liên quan: Tôi đã cố gắng kết nối với cơ sở dữ liệu SQL Azure bằng cách sử dụng SQL Server Management Studio (SSMS) với một người dùng có chứa . Tôi đã nhận được thông báo "Đăng nhập thất bại cho người dùng" trong SSMS.

Giải pháp: trong các tùy chọn kết nối SSMS cho cửa sổ truy vấn, tôi đã đặt "Kết nối với cơ sở dữ liệu" thành tên của cơ sở dữ liệu mà tôi đang cố gắng kết nối.

Giải thích: Nhìn chung, lý do rất rõ ràng: người dùng có chứa chỉ được phép kết nối với (các) cơ sở dữ liệu mà họ đã được tạo.


Quan tâm để giải thích bỏ phiếu xuống?
Vince Horst

1
Không phải tôi nhưng có lẽ bởi vì câu trả lời của bạn là loại ngược lại với câu hỏi. Mặc dù vậy vẫn hữu ích và nhờ thiết kế xấu của hộp thoại SSMS mà một lỗi dễ mắc phải!
Simon_Weaver

0

Điều này có thể xảy ra nếu chạy lệnh Powershell chứa chuỗi kết nối khi mật khẩu của bạn chứa $ . Bạn có thể khắc phục điều này bằng cách kèm theo chuỗi kết nối với các dấu ngoặc đơn - hoặc bằng cách không lưu trữ mật khẩu của bạn trong chuỗi kết nối ở vị trí đầu tiên ;-)

Ví dụ. Tôi chạy vào đây với Scaffold-DbContextlệnh

https://github.com/aspnet/EntityFrameworkCore/issues/6624

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.