IIS中MVC应用的Identity身份验证能否共享给虚拟应用下的WebAPI?
实现方案说明
答案是完全可以,根据你的技术栈和使用场景,可从以下3种常用方案中选择:
方案1:共享Identity认证Cookie(同域名场景首选,开发量最小)
因为WebAPI是MVC应用下的IIS虚拟应用,二者默认共享同一个域名,只要统一两边的认证配置即可自动传递用户身份:
- 两边项目使用相同版本的Identity相关依赖包,.NET Framework环境用
Microsoft.Owin.Security.Cookies,.NET Core/.NET 5+环境用Microsoft.AspNetCore.Authentication.Cookies - 统一认证加密配置:
- .NET Framework环境:两个项目的
web.config中配置完全一致的<machineKey>节点,validationKey和decryptionKey值完全相同 - .NET Core/.NET 5+环境:两边都配置统一的数据保护规则,示例代码:
builder.Services.AddDataProtection() // 两边使用同一个本地路径存储密钥,或者用共享的密钥存储服务 .PersistKeysToFileSystem(new DirectoryInfo(@"C:\shared-keys-folder")) // 两边的应用名必须完全一致 .SetApplicationName("SharedIdentityApp"); - .NET Framework环境:两个项目的
- 两边的Cookie认证配置完全一致:Cookie名称、域名(同域名可留空)、Cookie路径配置为
/、过期时间完全相同
配置完成后,用户在MVC端登录后生成的认证Cookie,在请求同域名下的WebAPI时会自动携带,WebAPI控制器中可以直接通过User.Identity读取已验证的用户信息。
方案2:JWT令牌传递(适合跨域或者有前后端分离需求的场景)
如果Cookie方案受安全规则限制无法使用,可以用令牌方式传递:
- 用户在MVC端完成身份验证后,后台生成包含用户ID、角色、权限等身份信息的JWT令牌返回给前端
- 前端请求WebAPI接口时,在请求头中添加
Authorization: Bearer {你的JWT令牌} - WebAPI端配置JWT认证中间件,校验令牌合法后会自动将用户身份信息填充到
HttpContext.User,控制器直接读取即可
方案3:自定义请求头传递(适合MVC服务端直接调用WebAPI的场景)
如果是MVC后台服务直接调用WebAPI,没有前端参与的场景,可以用自定义头传递:
- MVC端拿到已登录用户的身份标识后,在发起WebAPI请求的请求头中添加自定义字段,比如
X-User-Id、X-User-Roles - WebAPI端实现一个全局中间件或者ActionFilter,读取自定义请求头的内容,构造合法的
ClaimsIdentity后赋值到HttpContext.User - 注意:该方案必须做好WebAPI的访问限制,只允许MVC应用的IP访问接口,避免恶意伪造请求头窃取身份
以上所有方案都需要确保两边项目的身份声明(Claims)命名规则完全一致,避免出现字段读取失败的问题
内容的提问来源于stack exchange,提问作者Braydie
相关产品推荐
相关产品推荐

