最近、ASP.NET Core を介して AD アカウントのパスワード変更プログラムを作成しようとしました。,アーキテクチャの観点から見ると、一般に AD 認証とパスワード変更用の Web API があります。,最後に、デスクトップ アプリケーションを作成します。,ユーザーが自分で変更できるようにする。今回完成したのは、アカウントとパスワード認証用のWeb APIです。,プログラムは以下の通りです:
「プロジェクトテンプレート」
- ASP .NET Core Web API
《NuGet 安裝套件》
- System.DirectoryServices.Protocols (ADスイート)
- スワッシュバックル.AspNetCore (APIテストスイート,または、新しいプロジェクトを追加するとき,OpenAPIも確認できます)
サービス/UserPasswordService.cs
using System.DirectoryServices.Protocols; using System.Net; namespace AD.Services { public class UserPasswordService(IOptions<LdapSettings> ldapSettings) { private readonly string _ldapServer = ldapSettings.Value.Server; private readonly string _domain = ldapSettings.Value.Domain; public bool Validate(string username, string password) { try { var credentials = username; using var connection = new LdapConnection(new LdapDirectoryIdentifier(_ldapServer)); connection.Credential = new NetworkCredential(username, password, _domain); connection.AuthType = AuthType.Negotiate; // 使用 Negotiate 會先嘗試 Kerberos,失敗再改試 NTLM。 connection.Bind(); // 嘗試綁定,成功表示驗證通過 return true; } catch (LdapException) { return false; // 驗證失敗 } } } }
コントローラー/PasswordValidationController.cs
using AD.Services; using AD.Models; using Microsoft.AspNetCore.Mvc; namespace AD.Controllers { [Route("Password-Validate")] [ApiController] public class PasswordValidationController(UserPasswordService userPassword) : ControllerBase { [HttpPost("validate")] public IActionResult Validate([FromBody] LoginRequest request) { if (string.IsNullOrWhiteSpace(request.Username) || string.IsNullOrWhiteSpace(request.Password)) { return BadRequest("使用者帳號或密碼不可為空白。"); } var isValid = userPassword.ValidatePassword(request.Username, request.Password); return isValid ? Ok("驗證成功。") : Unauthorized("驗證失敗。"); } } }
モデル/LoginRequestDTO.cs
namespace AD.Models { public class LoginRequestDTO { public string Username { get; set; } // DTO (Data Transfer Object) 類型的屬性不需要初始化,因為它們的值由外部輸入資料 (例如 HTTP 請求) 決定。 public string Password { get; set; } } }
モデル/LdapSettings.cs
namespace AD.Models { public class LdapSettings { public string Server { get; set; } = string.Empty; public string Domain { get; set; } = string.Empty; } }
アプリ設定.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "LdapSettings": { "Server": "dc.abc.com.tw", // 如果是用 Kerberos 驗證,AD 的伺服器不可以使用 IP。 "Domain": "abc" } }
プログラム.cs
using AD.Models; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.Configure<LdapSettings>(builder.Configuration.GetSection("LdapSettings")); // 讀取 appsettings.json 的 LdapSettings 資料。 builder.Services.AddScoped<UserPasswordService>(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. // 讓 Swagger 只在開發環境時使用。 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
いつテストするか,スワッガー経由,アカウントとパスワードを入力してテストします。
[…] 完成了《AD 密碼驗證》與《AD 密碼修改》兩個 API 後,次に、.NET MAUI Blazor を使用してデスクトップ プログラムを作成します。Blazor について少し学習した後,とても魔法のように感じます,Webページをアプリケーションに組み込むような感じ,実行中は、「ジョブ マネージャー」でその背後で実行されている Edge 関連コンポーネントも確認できます。,次に、F12 を押すと、開発者ツール ウィンドウが表示されます。しかし、これにはセキュリティ上の懸念もいくつかありました。。しかし、全体的な感触は非常に特別です。,私はたまたまウェブページの構文に精通しています,Razor を使用して UI 画面をデザインする,よりフレンドリーな気分に。 […]
[…] ADパスワードを検証するためのAPI […]
兄弟,軟體功力越來越強囉!
因為最近認識了一個很給力的兄弟叫 AI 😀