Windows 認証とローカル認証の併用(Windows+Local)
Provider = "Windows" の IIS SSO を使いながら、AD に居ない管理者などのローカル専用ユーザーもログインできるようにする改修の検討です。
本体の標準機能ではありません
1.5.8.1 のプリザンターに "Windows+Local" という Provider はありません。以下は現行の実装(1.5.8.1)を前提にした改修案です。
前提にした現行の実装
詳細は 認証方式の内部動作 にあります。
Provider = "Windows"のログインフォームは、case "LDAP":と同じ分岐でLdap.Authenticateだけを呼びます。ローカル DB へのフォールバックはありません(UserModel.Authenticate)。"LDAP+Local"は LDAP に失敗したらGetByCredentialsでローカル DB を試しますが、IIS の SSO は使いません。- IIS の SSO を検出するのは
Context.AuthenticationsWindowsで、Provider == "Windows"か、Identity の型名がWindowsを含むときにtrueです。
改修箇所
- ログインフォーム:
UserModel.Authenticate(Context)のswitchにcase "Windows+Local":を追加し、"LDAP+Local"と同じく、Ldap.Authenticateに失敗したらGetByCredentialsを呼ぶ。 - SSO の検出:
Context.AuthenticationsWindowsの条件にProvider == "Windows+Local"を加え、セッション開始時のミドルウェアでの IIS SSO(WindowsAuthenticated)を有効のままにする。
改修イメージ
csharp
// UserModel.Authenticate(Context) の switch に追加
case "Windows+Local":
authenticated = Ldap.Authenticate(
context: context,
loginId: LoginId,
password: context.Forms.Data("Users_Password"));
if (authenticated)
{
Get(
context: context,
ss: SiteSettingsUtilities.UsersSiteSettings(context: context),
where: Rds.UsersWhere().LoginId(
value: context.Sqls.EscapeValue(LoginId),
_operator: context.Sqls.LikeWithEscape));
}
else
{
authenticated = GetByCredentials(
context: context,
loginId: LoginId,
password: Password,
tenantId: context.Forms.Int("SelectedTenantId"));
}
break;
// Context.AuthenticationsWindows
public bool AuthenticationsWindows()
{
if (Parameters.Authentication.Provider == "Windows"
|| Parameters.Authentication.Provider == "Windows+Local")
{
return true;
}
return IdentityType?.Contains("Windows") ?? false;
}AuthenticationsWindows は SSO の検出のほか、CheckContextAttributes(Users に居ないユーザーの扱い)やサイト削除時の認証の要否(DisableDeletingSiteAuthentication)でも使われているため、それらの挙動も "Windows" と同じになる点を確認します。
想定する動作
IIS では Windows 認証と匿名認証の両方を有効にします。
図を読み込み中…
| 項目 | 評価 |
|---|---|
| 変更するファイル | UserModel.cs・Context.cs(必要ならパラメータの説明) |
| 既存の動作 | 新しい Provider 値を足すだけで、既存の case は変えない |
| テスト観点 | SSO 成功で AD から同期される / フォームで AD に成功 / フォームで AD に失敗しローカル DB で成功・失敗 |
| リスク | IIS の匿名認証を有効にするため、SSO に失敗した利用者もログインフォームに到達できる。社内のセキュリティポリシーとの整合を確認する |