Azure SQL Databaseのアプリケーションでは「ユーザーのログインに失敗しました」が、SSMSでは正常に機能する


14

Azure SQL Database V12に含まれるデータベースユーザー機能を試してみたかったのですが、認証に問題があり、奇妙に思えます。

というデータベースを作成しましたClassifier。ワークステーションのSSMSからAzure dbサーバーに接続できるように、ファイアウォールルールにIPを追加しました。管理のためにSSMSを介して接続できるようになったら、次のようにパスワードを持つユーザーをデータベースに追加してみました。

CREATE USER classifier WITH PASSWORD='thepassword'

また、このユーザーをデータライターおよびリーダーの役割に追加しました。

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

この後、SSMSからのこれらの資格情報を使用してデータベースに接続できます。

ここに画像の説明を入力してください

しかし、これが問題の原因です。いくつかの異なる接続文字列の呪文を試してみましたが、作業中のWebアプリで接続できないようです。Azure環境では機能しなかったため、Azureデータベースへの接続文字列を使用してlocalhostで実行していますが、接続できません。現在使用している接続文字列は次のとおりです。

<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"/>

ユーザーのパスワードを(SSMS経由で)リセットしてから、接続文字列を更新しようとしました。また、この接続文字列からSSMSの接続ダイアログにパスワードをコピーしてパスワードを再確認し、そこに何らかのタイプミスがないことを確認しました。

Azure dbサーバーで監査を有効にし、失敗の理由に関する詳細を取得することを期待していますが、取得できるのはこれだけです:

エラー18456、レベル14、状態1、SQL Azureのサーバー1行目、ユーザー「分類子」のログインに失敗しました

そして、これは私が立ち往生しているところです。ドキュメントやブログで見つけることができたもののほとんどは、SQL Serverログを調べて、エラーの性質をより厳密に示す実際のエラー状態を確認することを示していますが、 Azureを扱っているので、それを行う方法はありません(私の知る限り)。

SSMS(およびLinqPadおよびVisual Studio Server Explorer)が成功した場合、アプリケーションが失敗する原因は何ですか?

回答:


15

包含データベース/包含ユーザーでは、次を指定する必要があることがわかりました。

GRANT CONNECT TO [YOUR_USER]

そうでCONNECTない場合、デフォルトで取り消されるようです。上記の変更を行うと、データベースにアクセスできます。


動作していた既存のアカウントがあり、動作しなくなった。再度接続を許可する必要がありました。
シェーンコートリル

AzureではCannot find the user 'myuser', because it does not exist or you do not have permission.、ユーザー名が[セキュリティ]> [ログイン]の下にありますが、[MyDatabse]> [セキュリティ]> [ユーザー]ではありませんが、エラーが発生しています。試しましCREATE USER [myuser] FOR LOGIN [myuser] WITH DEFAULT_SCHEMA=[mydb] GOたが、エラーが発生しましたThe login already has an account under a different user name.
Korayem

同様の問題がありました。開発環境では、SQL Azureへの接続はすべて機能しますが、一度公開されるとそのエラーがスローされます。ただし、コマンドを実行したり、ユーザーを作成したりすることはできません。
リッカーシルバ

@dezso同様の問題に直面しています。私のADO.NETおよびEF(DBContext)コードはローカルマシンで正常に動作します(Azureでは試していません)が、IdentityDBConextを使用して実装されたEFコードは失敗します。何が間違っているのか、IdentityDBConextのどの機能がサーバーへのアクセスを必要とするのかわかりません。ここに私の元の質問のあるstackoverflow.com/questions/40260720/...
Hirenデサイ

5

新しい包含ユーザーを介してAzureデータベースに接続するようにAPIを切り替えるとき、接続文字列を変更して以下を含める必要がありました。

Persist Security Info=True;

この変更が必要な理由はわかりませんが、将来他の誰かに役立つ場合に備えてここに投稿したいと思います。

私たちはもともとこの質問からこれを試しに来ました。


2

私の問題は異なっていましたが、関連していました。包含ユーザーで SQL Server Management Studio(SSMS)を使用してAzure SQLデータベースに接続しようとしていました。SSMSで「ユーザーのログインに失敗しました」というメッセージが表示されました。

解決策:クエリウィンドウのSSMS接続オプションで、[データベースに接続]を接続しようとしたデータベースの名前に設定しました。

説明:後知恵では、理由は明らかでした。包含ユーザーは、作成されたデータベースへの接続のみ許可されています。


反対票を説明することに注意してください?
ビンスホルスト

1
私ではなかったかもしれませんが、おそらくあなたの答えは質問の反対です。それでも便利ですが、そのSSMSダイアログの悪いデザインのおかげで、間違いを犯しやすいです!
Simon_Weaver

0

これは、パスワードにが含まれて$いるときに接続文字列を含むPowershellコマンドを実行すると発生する可能性があります。接続文字列を一重引用符で囲むか、最初の接続文字列にパスワードを保存しないことで、これを回避できます;-)

例えば。私はScaffold-DbContextコマンドでこれに遭遇しました

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.