-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ASPNETFormsAuthentication
- 戻る(ASP.NET(
MS_ASPNET.md)、認証基盤)- ASP.NET Forms認証
- ASP.NET Identity
-
Forms 認証とは、Form にユーザアカウント情報を入力して
Web/AP サーバで認証をする認証方式の呼称である。 -
ASP.NET Forms 認証は、ASP.NET で Forms 認証を実装するための、
最も基本的な認証基盤機能である。 -
ASP.NET Identityでは、
非常に沢山のことを覚え、実装を記述する必要があるが、Forms 認証では、
僅か、下記の実装のみで暗号化された Cookie 認証チケットを使用した
認証基盤機能を利用できるため、
ASP.NET アプリケーションの認証基盤として利用される機会が多い。
補足(最新化): 本ページは .NET Framework の ASP.NET(Web Forms / MVC 5)の 話である。ASP.NET Core には Forms 認証は存在しない。 相当する機能は Cookie 認証ミドルウェア (
Microsoft.AspNetCore.Authentication.Cookies)に置き換わっている。builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Account/Login"; options.ExpireTimeSpan = TimeSpan.FromMinutes(60); options.SlidingExpiration = true; });
Web.configの<authentication mode="Forms">は ASP.NET Core では無視される(そもそも読まれない)。
<authentication mode="Forms">
<forms name="formauth"
loginUrl="(ログイン画面のURL)"
defaultUrl="(メニュー画面のURL)"
protection="All"
timeout="60"
path="/"
requireSSL="false"
slidingExpiration="true"
enableCrossAppRedirects="false"
cookieless="UseDeviceProfile" domain="">
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>※ Web.config(MS_DotNetConfig.md)の authentication タグの
timeout 属性に記述する(ASP.NETで考慮すべきタイムアウト値 参照)。
補足(セキュリティ): 上記の例のうち、本番で見直すべき箇所がある。
属性 例の値 推奨 requireSSLfalsetrue(Cookie に Secure 属性が付く)cookielessUseDeviceProfileUseCookies(URL にチケットを埋め込ませない)protectionAllAllのまま(暗号化+改ざん検証)
cookielessで URL にチケットが載ると、 リファラやアクセス ログから漏れる。 また、HttpOnlyは既定で付くが、 SameSite属性の件 の観点では<httpCookies sameSite="Lax" />の明示も検討すること。

認証ロジック(コードビハインド、C# の場合)
protected void Button1_Click(object sender, EventArgs e)
{
// ユーザ名、パスワードを取得。
string userName = this.TextBox1.Text;
string passWord = this.TextBox2.Text;
// 任意の認証ロジック(userName、passWordからユーザを認証する)。
// 認証が完了した場合、認証チケットを生成し、元のページにRedirectする。
// 第2引数は、クライアントがCookieを永続化(ファイルとして保存)するかどうか
// を設定する引数であるが、セキュリティを考慮して、falseの設定を勧める。
FormsAuthentication.RedirectFromLoginPage(userName, false);
}補足(重要): 「任意の認証ロジック」の部分が実装者任せである点が、 Forms 認証の手軽さであり危うさでもある。最低限、次を守ること。
- パスワードはソルト付きの低速ハッシュで保存する (PBKDF2 / bcrypt / Argon2。.NETの署名・暗号化アルゴリズム 参照)
- 比較は定数時間で行う(
CryptographicOperations.FixedTimeEquals)- ログイン成功時にセッション ID を再生成する(セッション固定攻撃対策)
- 試行回数の制限とロックアウトを実装する
ASP.NET Identity が 「覚えることが多い」代わりに提供しているのは、まさにこれらである。
machine key と Cookie 認証チケットの cookie 名を同じにする。
補足: Web ファームで machineKey を明示していないと、 サーバごとに鍵が異なり、別サーバに振られた瞬間に認証が切れる。 ASP.NET Core では、同じ問題は Data Protection の鍵リングを共有すること (
PersistKeysToFileSystem+SetApplicationName)で解決する。
上記に加え、enableCrossAppRedirects 要素を true に設定することで、
ASP.NET 2.0 から Web サイト間のシングル サイン オンも可能になった。
Forms 認証は ASP.NET の認証基盤機能であるため、
動的コンテンツ(aspx)以外に利用できないと思われがちだが、
下記のような設定によって静的コンテンツにも適用できるようになる。
ただし、IIS 6.0 では、Web.config ファイルに以下の例に従った記述が必要になる。
<httpHandlers>
<add verb="*" path="*.pdf" type="System.Web.StaticFileHandler" />
<add verb="*" path="*.html" type="System.Web.StaticFileHandler" />
</httpHandlers>※ 拡張子ごとに、add タグを追加する。
補足: IIS 7 以降の統合パイプライン モードでは、 静的ファイルも既定で ASP.NET のパイプラインを通るため、 この設定は不要である(
runAllManagedModulesForAllRequestsの話)。 上記は IIS 6 / クラシック モード向けの記述である。
以下の設定で認証対象外に設定できる(フォルダやファイル単位で指定できる)。
<!-- Framework ファイルを認証対象外にする -->
<location path="Framework/Img">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>-
クロスサイト
ASP.NET の Forms 認証では、Cookie 認証チケットをクロスサイトで使用できる。 -
クロスドメイン
-
しかし、クロスドメインでの Cookie 認証チケットの引継は不可能という制限を持っている。
-
クロスドメイン間のサイトで、テンポラリの認証情報を QueryString 等で引き継いで、
連携先サイトで、別途 Forms 認証の Cookie 認証チケットを発行すると言う方式の実績もある。 -
しかし、小手先の実装だし、要件に合わないようなら、個別に
- 「統合認証基盤型」の認証基盤製品の導入
- 「クレームベース認証」のサポート
等を検討した方が良さそう。
-
補足: この判断は正しく、現在も同じである。 ドメインを跨ぐ SSO は SAML / WS-Federation / OpenID Connect で解くべき問題であり、 Cookie を工夫して解こうとすべきではない。 QueryString に認証情報を載せる方式は、 ログ・リファラからの漏洩とリプレイの経路になるため避けること。
なお、サードパーティ Cookie の制限強化 (SameSite属性の件)により、 小手先の Cookie 共有はますます成立しにくくなっている。
- ASP.NET Mobile Web(既に discon)では
cookieless="UseUri"を使い、
URL にチケットを埋め込む方式が用いられた。 - ASP.NET MVC / ASP.NET Core における認証は、それぞれの項を参照。
Tags: .NET開発, ASP.NET, ASP.NET Web Forms, ASP.NET MVC, 認証基盤, セキュリティ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。