Skip to content

Windows 認証とローカル認証の併用(Windows+Local) ​

第1版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

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 です。

改修箇所 ​

  1. ログインフォーム: UserModel.Authenticate(Context) の switch に case "Windows+Local": を追加し、"LDAP+Local" と同じく、Ldap.Authenticate に失敗したら GetByCredentials を呼ぶ。
  2. 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 に失敗した利用者もログインフォームに到達できる。社内のセキュリティポリシーとの整合を確認する

関連ページ ​

変更履歴

第1版認証方式(2 段階認証・パスキー・LDAP・フォールバック)と認証基盤の解説、関連する改修・設計メモを追加