Angular对接Windows集成认证的工作原理是什么?
嘿,刚好对这块熟,来给你掰扯清楚整个流程,你之前的猜想方向其实是对的,核心就是让IIS接管身份验证,Angular只负责前端逻辑,咱们一步步来:
第一步:先把IIS的认证基础搭好
和你之前用.NET时配置IIS的思路完全一致:把部署Angular应用的IIS站点,开启Windows身份验证(也就是NTLM/Kerberos集成认证),同时必须禁用匿名访问。这一步是让IIS成为身份验证的“守门人”,所有请求都得先过它这关。第二步:用户用IE访问时的浏览器交互
当用户打开你的Angular应用URL,IE会先发一个普通的HTTP请求给IIS。IIS一看这个站点要求Windows认证,直接返回401 Unauthorized,同时在响应头里带上WWW-Authenticate: NTLM(域环境下还可能带Kerberos)。
因为是内网环境,IE默认在Intranet区域允许自动发送当前Windows登录的凭据,所以它会悄悄提取用户的域账号信息,用NTLM算法加密后,再发一次请求给IIS。第三步:IIS的身份校验环节
IIS收到带NTLM加密凭据的请求后,会和域控制器(如果是单机部署就查本地SAM数据库)通信,验证这个账号是不是合法、有没有访问权限。校验通过后,IIS就会把这个已认证的用户信息“传递”下去——这里要注意,Angular本身不碰认证逻辑,全程都是IIS在干活。第四步:Angular后续请求的自动认证
第一次认证通过后,浏览器会记住这个站点的NTLM会话状态。之后Angular发起的所有API请求(比如调用你之前的.NET Web API),浏览器都会自动带上NTLM认证信息,IIS直接放行,用户完全感知不到重复认证的过程。
几个你可能关心的关键点
- 为啥IE更顺畅? 因为IE/Edge默认给内网站点开了自动发凭据的权限,Chrome/Firefox得手动把你的站点加到信任区域,才能实现同样的自动登录效果。
- 跨域怎么办? 如果Angular和后端API是同一个域名,完全没毛病;要是不同子域名,得在IIS配置跨域允许携带凭据(
Access-Control-Allow-Credentials: true),同时Angular的HTTP请求要设置withCredentials: true。 - 和.NET后端兼容吗? 完全兼容!你之前的.NET Web API如果已经支持Windows认证,Angular调用它的时候,后端直接通过
User.Identity就能拿到用户信息,和之前用.NET MVC时一模一样。
内容的提问来源于stack exchange,提问作者Lee

