トップ回答者
MVCで1つのプロジェクトを置きその階層下にもう一つプロジェクトを構成した時のaspnetDBについて

質問
-
お世話になります。
レンタルサーバー上にプロジェクト①1つ構成しそのプロジェクトの階層下にさらに1つのプロジェクト②を配置しています。
この時のログインのデータベース(aspnet-XXXX.mdf)がApp_Data内に作成されますが、この時、プロジェクト②の App_Dataには作成されずプロジェクト①のログインデータベースが有効になっているようです。
この時、別々のログイン用のデータベースを構築できますか?
Web.config に
<connectionStrings>
<add connectionString="metadata=res://*/UserModel.csdl|res://*/UserModel.ssdl|res://*/UserModel.msl;provider=System.Data.SqlClient;provider connection string="data source=アドレス;initial catalog=aspnet-xxxxxxr-20191121;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" name="Entities2" providerName="System.Data.EntityClient" />としても効果ないようです。
Windows Server 2016 DataCenter MVC(多分5.0) Management Studio 14.0 SQL Server 2017
開発環境 VS2015 C# MVC Windows10
回答
すべての返信
-
いつもそうなんですが、いろいろ不明点が多すぎです。どういう情報を提供すべきか、もっとよく考えて質問してください。
Visual Studio のテンプレートを使ったプロジェクトの ASP.NET Identity 2 のクッキーベースのユーザー認証と理解してます。違ったらどう違うのか書いてください、運用環境で、
> この時のログインのデータベース(aspnet-XXXX.mdf)がApp_Data内に作成されますが
とか、接続文字列が、
> connectionString="metadata=res://*/UserModel.csdl|res: ...
と DB First で EDM を作ったようになっているのが解せませんが、とりあえずそれらはちょっと置いておいて・・・
> 別々のログイン用のデータベースを構築できますか?
ということは、今は認証クッキーが ① と ② で共有できているが、それを別々にしたいということであればクッキーの名前を別々にして試したらどうなりますか?
-
質問の意味を誤解してたかもしれません。
基本的にやりたいことは ① と ② で認証クッキーを共有するということ、即ち ① でログインしたら ② に遷移してもログイン状態が保持される、逆に ② でログインしたら ① に遷移してもログイン状態が保持されるということですか?
そうであれば、
> 別々のログイン用のデータベースを構築できますか?
ということは必要なく、もともとある ① 用のデータベースを ② で共有します。
② では接続文字列を ① と同じにし同じデータベースに接続できるようにします。
そして、machineKey の設定を ① と ② で完全に同じにします。
そのあたりは旧来のフォーム認証を使用していた ASP.NET Web アプリと同じです。
アプリケーション間のフォーム認証
https://docs.microsoft.com/ja-jp/previous-versions/visualstudio/visual-studio-2008/eb0zx8fc(v=vs.90)?redirectedfrom=MSDN
- 編集済み SurferOnWww 2019年11月25日 6:52
-
お世話になります。
説明がうまくできていないようで申し訳ありません。
「認証クッキー」なる言葉を初めて目にしましたが、
「http://surferonwww.info/BlogEngine/post/2011/12/03/Persistent-or-non-persistent-Forms-authentication-cookie.aspx」で、少しわかった気がします。
ですが、クッキーの名前を変えるとは、どこで、どのタイミングで?、一方のアプリで、そこにある全てのプロジェクトで行うのでしょうか?
Set-Cookie・・・で、変更できそうですが・・・
-
お世話になります。
> 話が通じてますか? 私の 2 つめのレスを読んでもらってますか?
見る前の投稿でした。
>① と ② で認証クッキーを共有するということ、即ち ① でログインしたら ② に遷移してもログイン状態が保持される、逆に ② でログインしたら ① に遷移してもログイン状態が保持されるということですか?
今がそれに近い状態です。①と②でログインを共有したいのでなく、それぞれを別の顧客用に設定したいと考えています。
①と②で顧客用のデータベースをそれぞれ別に「作成する」と考えています。ログインできるユーザーは、両方でなく一方のみとし、両方ログインしたいときは、それぞれに登録してもらうつもりでいます。
よろしくお願いします。
-
> ①と②で顧客用のデータベースをそれぞれ別に「作成する」と考えています。
それなら単純にそうして、① と ② は接続文字列を変えて別に作成されたデータベースに別々に接続するようにすれば、それ以外は何もしなくても、上の私のレスで書いたクッキー名の変更なども必要なく、デフォルトの設定のままで、
> ログインできるユーザーは、両方でなく一方のみとし、両方ログインしたいときは、それぞれに登録してもらうつもりでいます。
は実現できるはずです。
何が問題・課題なのか分かりません。それをここに書いてあること以外は何も知り得ない第三者に分かるように書いてください。
あと、最初の私のレスで指摘した、
運用環境で、
> この時のログインのデータベース(aspnet-XXXX.mdf)がApp_Data内に作成されますが
とか、接続文字列が、
> connectionString="metadata=res://*/UserModel.csdl|res: ...
と DB First で EDM を作ったようになっている・・・と言う点についてもクリアにしてください。 -
【追記】
一つ注意点があるのを失念してましたので追記しておきます。
> ログインできるユーザーは、両方でなく一方のみとし、両方ログインしたいときは、それぞれに登録してもらうつもりでいます。
今回質問者さんのケースでは ① ② は同じドメインに属することになるので、① にも ② にも登録してあるユーザーが、例えば、まず ① にログインし、そのまま ② に移動して ② でログインすると、① の認証チケット/クッキーは失われてしまいます。逆も同様です。
何故ならデフォルトでは認証クッキーの名前が同じになるので、上記の例で言うと、① にログインし、そのまま ② に移動して ② でログインすると ① の認証クッキーの中身が ② の認証チケットで上書きされてしまうからです。
普通は一旦ログインすれば、ブラウザを閉じるかクッキーを削除しない限り、サイトから離れても認証チケット/クッキーは保持されるので、再びそのサイトを訪れてもログイン操作をする必要はありません。それが望みであれば、認証クッキーの名前を ① と ② で別にする必要があります。 -
お世話になります。
>> この時のログインのデータベース(aspnet-XXXX.mdf)がApp_Data内に作成されますが
> とか、接続文字列が、
>> connectionString="metadata=res://*/UserModel.csdl|res: ...
>と DB First で EDM を作ったようになっている・・・と言う点についてもクリア開発時にいつものように作成しただけです。これを設置する段階でこの形になりましたが、これだと何か問題があるのでしょうか?
この形とは、「プロジェクト①1つ構成しそのプロジェクトの階層下にさらに1つのプロジェクト②を配置しています」です。
-
> 改善しないのではなく、ご指摘の内容が理解できていません。
改善できてないのは情報不足という点なのですが認識いただいているでしょうか? 一番最初の私のレスで書いた、
"いつもそうなんですが、いろいろ不明点が多すぎです。どういう情報を提供すべきか、もっとよく考えて質問してください。"
・・・ということです。
そう言っても分からないかもしれませんので、具体例を挙げて言うと、
> この時のログインのデータベース(aspnet-XXXX.mdf)がApp_Data内に作成されますが
と書いてありますが、普通、運用環境(IIS + SQL Server)ではそれでは動かないです。(開発環境で IIS Express と LocalDB を使う場合は話は別です)
接続文字列が、
> connectionString="metadata=res://*/UserModel.csdl|res: ...
と DB First で EDM を作った時のようになることもありません。
もしそれでも動いているということであれば、あなたの環境はかなり特殊で、その情報が提供されてない状況で議論をしても意味がないということです。
もう一度お願いしますが、いろいろ不明点が多すぎですので、どういう情報を提供すべきか、もっとよく考えて質問してください。