离线环境下本地AD+Angular+.NET 6身份认证配置指南求询
离线环境下本地AD + .NET 6 + Angular 16 身份认证配置方案
针对离线环境中使用本地AD搭建身份认证的需求,以下是具体的配置步骤,无需依赖Azure AD或公网连接:
.NET 6 后端配置
场景1:后端与客户端均在本地AD域内
这种场景下直接启用Windows身份验证是最便捷的方式,离线环境下域控制器会本地校验用户身份:
- 在
Program.cs中配置认证服务:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(); builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; }); // 务必在路由前添加认证授权中间件 app.UseAuthentication(); app.UseAuthorization();
- 在项目属性中启用Windows身份验证,同时禁用匿名身份验证(确保只有域内用户能访问接口)。
场景2:后端不在AD域内/需要自定义认证逻辑
如果后端无法加入域,可通过System.DirectoryServices.AccountManagement库直接连接本地AD进行用户校验:
- 安装NuGet包:
Install-Package System.DirectoryServices.AccountManagement
- 编写AD用户校验方法:
using System.DirectoryServices.AccountManagement; public bool ValidateLocalAdUser(string username, string password) { // 替换为你的本地AD域名或域控制器内网地址 using var adContext = new PrincipalContext(ContextType.Domain, "YOUR_LOCAL_AD_DOMAIN"); // 离线环境下使用Negotiate选项,无需公网 return adContext.ValidateCredentials(username, password, ContextOptions.Negotiate); }
- 校验通过后,可生成JWT令牌返回给前端(避免每次请求都校验AD):
using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; public string GenerateJwtToken(string username) { var secretKey = Encoding.ASCII.GetBytes(builder.Configuration["Jwt:SecretKey"]); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, username) }), Expires = DateTime.UtcNow.AddHours(8), SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(secretKey), SecurityAlgorithms.HmacSha256Signature) }; var tokenHandler = new JwtSecurityTokenHandler(); var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); }
- 在
Program.cs中配置JWT认证:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(builder.Configuration["Jwt:SecretKey"])), ValidateIssuer = false, ValidateAudience = false }; });
Angular 16 前端配置
场景1:域内Windows身份验证
前端只需在请求中携带域用户凭证即可,无需登录页面:
- 在HTTP请求中设置
withCredentials: true:
import { HttpClient } from '@angular/common/http'; constructor(private http: HttpClient) {} fetchProtectedData() { this.http.get('/api/protected-resource', { withCredentials: true }) .subscribe(data => { // 处理返回数据 }); }
场景2:自定义登录页面(非域内场景)
针对手动AD校验的场景,需要实现登录页面并处理JWT令牌:
- 创建登录组件,提交用户名密码到后端校验:
login(username: string, password: string) { this.http.post<string>('/api/auth/login', { username, password }) .subscribe(token => { // 将令牌存储到本地存储 localStorage.setItem('auth-token', token); // 跳转至受保护页面 }); }
- 配置HTTP拦截器,自动在请求头添加JWT:
import { Injectable } from '@angular/core'; import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable() export class AuthInterceptor implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const token = localStorage.getItem('auth-token'); if (token) { req = req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }); } return next.handle(req); } }
- 在
app.module.ts中注册拦截器:
import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { AuthInterceptor } from './auth.interceptor'; @NgModule({ providers: [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true } ] }) export class AppModule {}
离线环境核心注意事项
- 确保.NET后端能访问本地AD域控制器,配置内网DNS指向域控制器,无需公网连接
- Angular项目需提前下载所有依赖包到本地npm仓库(使用
npm pack或离线镜像),构建后部署到本地服务器,避免依赖CDN资源 - 禁用任何依赖公网的认证逻辑(如Azure AD端点、外部OAuth服务)
- JWT密钥需存储在本地配置文件中,不要依赖云服务
内容的提问来源于stack exchange,提问作者James Jackson
相关产品推荐
相关产品推荐

