Azure SQL Database V12の contained database users 機能を試してみたかったのですが、認証に問題があり、奇妙に思えます。
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サーバーで監査を有効にして、失敗の理由に関する詳細を取得したいと考えていますが、取得できるのはこれだけです。
そして、これは私が行き詰まっているところです。ドキュメントやブログで見つけたほとんどのことは、SQL Serverのログを見て、実際のエラー状態が何であるかを確認することです。 Azureを扱っているので、それを行う方法はありません(私の知る限り)。
SSMS(およびLinqPadとVisual Studio Server Explorer)が成功した場合、アプリケーションが失敗する原因は何ですか?
含まれているデータベース/含まれているユーザーでは、指定する必要があることがわかりました:
GRANT CONNECT TO [YOUR_USER]
それ以外の場合、CONNECT
はデフォルトで取り消されているようです。上記の変更を行ったら、データベースにアクセスできます。
新しい包含ユーザーを介してAzureデータベースに接続するようにAPIを切り替えるとき、接続文字列を次のように変更する必要がありました。
Persist Security Info=True;
なぜこの変更が必要なのかはわかりませんが、将来誰かが助けてくれるようにここに投稿したいと思いました。
この質問 からこれを試すようになりました。
私の問題は異なっていましたが、関連していました。SQLServer Management Studio(SSMS)で contained user を使用してAzure SQLデータベースに接続しようとしていました。 SSMSで「ユーザーのログインに失敗しました」というメッセージが表示されました。
Solution:クエリウィンドウのSSMS接続オプションで、[データベースに接続]を、接続しようとしたデータベースの名前に設定しました接続します。
説明:結果を見ると、その理由は明らかでした。含まれているユーザーは、作成されたデータベースへの接続のみを許可されています。
これは、パスワードに$
が含まれているときに、接続文字列を含むPowershellコマンドを実行すると発生する可能性があります。これを回避するには、接続文字列を一重引用符で囲むか、最初に接続文字列にパスワードを格納しないようにします。;-)
例えば。 Scaffold-DbContext
コマンドでこれに遭遇しました