質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

2476閲覧

sessionState を「InProc」以外に変更するとログインできない

ASP.NET

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2021/09/07 03:30

Visual Studio 2019 Pro
C#
SQLServer 2014 Standard(Windows 認証)
Windows Server 2016(開発時は Windows 10 Pro)
ASP.NET Web Form
Net Framework 4.8
Microsoft Edge 93

利用者からパスワードがあっているのにログインできないという問い合わせが急増しました。
IISを再起動するとログインできるようになります。よって利用者の「パスワードは間違っていない」というのは正しい主張だと確認が取れています。

具体的には、ログインボタンを押すと、ログイン画面にリダイレクトされます。エラー表示は何もありません。ログインのコードは以下の通りです。

C#

1protected void LogIn(object sender, EventArgs e) 2{ 3 if (IsValid){ 4 var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>(); 5 var result = signinManager.PasswordSignIn(UserID.Text, Password.Text, RememberMe.Checked, false); 6 switch (result){ 7 case SignInStatus.Success: 8 string rUrl = Request.QueryString["ReturnUrl"]; 9 if (string.IsNullOrWhiteSpace(rUrl)) 10 { 11 rUrl = "(ログイン後のトップページ)"; 12 } 13 IdentityHelper.RedirectToReturnUrl(rUrl, Response); 14 break; 15 16 // (以下省略) 17 } 18 } 19}

上記コードは Success を通過しております。

sessionState を InProc で使用しているのが原因なのではと思い始めました(恥ずかしながら使ってはいけないというのを今更知りました)。

そこで以下の通りに web.config を書き換えました。

ASP.NET

1<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" compressionEnabled="true" timeout="600" />

そしてASP.NET State Service を起動しました。しかし、今度は全くログインできなくなってしまいました。現象としては、ログインボタンを押すと、ログイン画面にリダイレクトされます。エラー表示は何もありません。IIS再起動でも、SQLServer再起動でも現象は変わりません。

このシステムで初めて ASP.NET Identity なるものを使いました(使ったつもりなのですが)が、どのファイルを確認すればよいのかも分からず行き詰っております。

その他やってみたことは、以下を記述し、aspnet_regsql.exe を使用し構成しましたが、全く同じ現象でログイン出来ておりません。

ASP.NET

1<sessionState mode="SQLServer" sqlConnectionString="Data Source=localhost;Integrated Security=True" cookieless="false" timeout="600" />

根本的な設定が何か欠けているのでしょうか。InProc に戻すと、ログインできるようになります。以下は当初の設定内容です。

ASP.NET

1<sessionState mode="InProc" customProvider="DefaultSessionProvider"> 2 <providers> 3 <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> 4 </providers> 5 </sessionState>

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ホントに間違いなく ASP.NET Identity を利用したクッキーベースの標準の認証システムなら Session は全く関係ありません。

あなたがテンプレートでプロジェクトを作成した際、認証に個別のユーザーアカウントを選んだのであれば上で言う「ASP.NET Identity を利用したクッキーベースの標準の認証システム」が自動的に実装されます。

その場合は sessionState 要素の mode 属性は InProc でも StateServer でも SQLServer でもその他でもユーザー認証には全く関係ありません。

質問に書いてある「利用者からパスワードがあっているのにログインできない」というのも Session とは全く関係ありません。

しかし、質問にある Login メソッドのコードは、自分が Visual Studio 2019 のテンプレートで .NET Framework 4.8 の Web Forms アプリを個別の認証システム(即ち ASP.NET Identity ベースの認証システム)を選んで自動生成されたものとは異なります。

独自に何かやっているのでは?

ASP.NET 標準の認証システムとは違うものを独自実装したということであれば、独自部分など第三者は知る由もないので話は通じません。なので、何が独自なのかを明確にしてもらわない限り、誰も助けられないと思います。

投稿2021/09/07 04:20

編集2021/09/07 05:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ASP.NET

2021/09/07 05:02

SurferOnWww 様 ご回答くださいまして誠にありがとうございます。 当初開発開始した時点では Visual Studio 2017 でしたが、一度、Azure AD からシングルサインオンできないか試した時、全部元に戻したつもりでしたが、もしかしたら戻し忘れがあったのかもしれません。 こちらについては、私の能力不足理解不足で、ご説明差し上げるのが困難であることから、ご迷惑にならないうちに取下げたいと思います。時間を見つけて再度新規プロジェクトから作成して内容を確認してみたいと思います。 誠に申し訳ございませんでした。 貴重なお時間をお使いいただき御礼申し上げます。
退会済みユーザー

退会済みユーザー

2021/09/07 05:18 編集

> InProc に戻すと、ログインできるようになります。 とのことですから、Session を使って何か独自のことをしているのではないかと想像しています。InProc の時の一番の問題は、Session 情報はワーカープロセスのメモリ上にあるので、ワーカープロセスがリサイクルされると Session 情報が消えてしまうということです。 でも、それと「利用者からパスワードがあっているのにログインできない」という現象とは違うので、そこは謎ですが。 あと、sessionState 要素の mode 属性は InProc であれば何も特別なことはしなくても Session は使えますが、StateServer とか SQLServer の場合はそれなりの準備がサーバーに必要です。質問者さんは「それなりの準備」をしてないので InProc から変えるとログインできなくなるのではなかろうかと思います(想像です)。
ASP.NET

2021/09/07 06:26

SurferOnWww 様、ご丁寧にありがとうございます。諸々再確認致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問