You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

离线环境下本地AD+Angular+.NET 6身份认证配置指南求询

离线环境下本地AD + .NET 6 + Angular 16 身份认证配置方案

针对离线环境中使用本地AD搭建身份认证的需求,以下是具体的配置步骤,无需依赖Azure AD或公网连接:

.NET 6 后端配置

场景1:后端与客户端均在本地AD域内

这种场景下直接启用Windows身份验证是最便捷的方式,离线环境下域控制器会本地校验用户身份:

  1. 在Program.cs中配置认证服务:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

// 务必在路由前添加认证授权中间件
app.UseAuthentication();
app.UseAuthorization();
  1. 在项目属性中启用Windows身份验证,同时禁用匿名身份验证(确保只有域内用户能访问接口)。

场景2:后端不在AD域内/需要自定义认证逻辑

如果后端无法加入域,可通过System.DirectoryServices.AccountManagement库直接连接本地AD进行用户校验:

  1. 安装NuGet包:
Install-Package System.DirectoryServices.AccountManagement
  1. 编写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);
}
  1. 校验通过后,可生成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);
}
  1. 在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身份验证

前端只需在请求中携带域用户凭证即可,无需登录页面:

  1. 在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令牌:

  1. 创建登录组件,提交用户名密码到后端校验:
login(username: string, password: string) {
    this.http.post<string>('/api/auth/login', { username, password })
        .subscribe(token => {
            // 将令牌存储到本地存储
            localStorage.setItem('auth-token', token);
            // 跳转至受保护页面
        });
}
  1. 配置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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:53:30