无需Azure AD:Azure云ASP.NET Web应用对接本地ADFS实现内网SSO
方案可行性与实现指南
一、完全可行!
你完全不需要依赖Azure AD就能实现Azure托管的Web应用和本地ADFS的SSO集成。ADFS本身就是独立的身份提供者(IdP),原生支持OpenID Connect和SAML 2.0这两种标准的身份认证协议,直接对接云应用是标准场景——那些提到Azure AD的示例大多是混合云场景的常见实践,但纯本地ADFS对接Azure Web应用完全没问题。
二、基于OWIN + OpenID Connect的实现步骤
我推荐用OpenID Connect来做,OWIN对这个协议的支持很成熟,而且不需要引入Azure AD相关的包,只用基础的认证中间件就行:
1. 先在本地ADFS中注册你的应用作为依赖方
- 登录ADFS管理控制台,添加依赖方信任,选择“导入数据”或者手动配置,记录下ADFS的元数据地址:
https://<你的ADFS服务器域名>/adfs/.well-known/openid-configuration - 设置重定向URI为你的Azure Web应用的回调地址:
https://<你的应用名>.azurewebsites.net/signin-oidc - 配置需要传递给应用的用户声明(比如姓名、邮箱、角色等),根据你的业务需求调整
2. 在Azure Web应用中配置OWIN中间件
首先安装必要的NuGet包:
Install-Package Microsoft.Owin.Security.OpenIdConnect Install-Package Microsoft.Owin.Security.Cookies Install-Package Microsoft.Owin.Host.SystemWeb
然后修改Startup.cs,配置认证中间件:
using Microsoft.Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.Cookies; using Microsoft.Owin.Security.OpenIdConnect; using Owin; using System.Configuration; using System.Threading.Tasks; [assembly: OwinStartup(typeof(YourApp.Startup))] namespace YourApp { public class Startup { public void Configuration(IAppBuilder app) { // 设置默认的登录认证类型为Cookie app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); // 配置Cookie认证,用来存储用户的身份信息 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, LoginPath = new PathString("/Account/Login") }); // 配置OpenID Connect对接ADFS app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { // 从ADFS元数据地址自动加载配置 MetadataAddress = ConfigurationManager.AppSettings["AdfsMetadataAddress"], // 这个要和ADFS中注册的依赖方标识符完全一致 ClientId = ConfigurationManager.AppSettings["AdfsClientId"], // 回调地址,必须和ADFS中配置的重定向URI一致 RedirectUri = ConfigurationManager.AppSettings["AdfsRedirectUri"], // 只请求ID Token(如果需要AccessToken可以调整为"code id_token") ResponseType = "id_token", // 请求的声明范围 Scope = "openid profile email", // 自定义认证事件处理 Notifications = new OpenIdConnectAuthenticationNotifications { // 认证成功后处理用户身份 SecurityTokenValidated = async n => { // 这里可以添加自定义声明,或者调整用户身份信息 n.AuthenticationTicket.Identity.AddClaim(new System.Security.Claims.Claim("custom-claim", "your-value")); await Task.CompletedTask; }, // 处理认证失败的情况 AuthenticationFailed = async n => { n.HandleResponse(); n.Response.Redirect($"/Error?message={System.Web.HttpUtility.UrlEncode(n.Exception.Message)}"); await Task.CompletedTask; } } }); } } }
接着在Web.config中添加配置项:
<appSettings> <add key="AdfsMetadataAddress" value="https://<你的ADFS服务器域名>/adfs/.well-known/openid-configuration" /> <add key="AdfsClientId" value="https://<你的应用名>.azurewebsites.net" /> <!-- 与ADFS依赖方标识符一致 --> <add key="AdfsRedirectUri" value="https://<你的应用名>.azurewebsites.net/signin-oidc" /> </appSettings>
三、SAML 2.0的备选实现方案
如果你更倾向于用SAML协议,也可以用Microsoft.Owin.Security.Saml包来实现:
1. ADFS端配置
在ADFS中注册依赖方时,选择SAML协议,配置断言消费者服务(ACS)地址为https://<你的应用名>.azurewebsites.net/saml/acs,并配置相关声明。
2. 应用端配置
安装NuGet包:
Install-Package Microsoft.Owin.Security.Saml
然后在Startup.cs中添加SAML中间件:
using Microsoft.Owin.Security.Saml; // ... 其他引用 public void Configuration(IAppBuilder app) { // 先配置Cookie认证(同上) app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, LoginPath = new PathString("/Account/Login") }); app.UseSamlAuthentication(new SamlAuthenticationOptions { AuthenticationType = "SAML", SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType, IdentityProvider = new SamlIdentityProvider { // ADFS的元数据地址 MetadataAddress = "https://<你的ADFS服务器域名>/adfs/metadata/federationmetadata.xml", EntityId = "https://<你的ADFS服务器域名>/adfs/services/trust" }, ServiceProvider = new SamlServiceProvider { // 应用的实体ID,与ADFS中配置的一致 EntityId = "https://<你的应用名>.azurewebsites.net", AssertionConsumerServiceUrl = new Uri("https://<你的应用名>.azurewebsites.net/saml/acs") }, Notifications = new SamlAuthenticationNotifications { AuthenticationFailed = async context => { context.HandleResponse(); context.Response.Redirect("/Error"); await Task.CompletedTask; } } }); }
四、关键注意事项
- 网络连通性:Azure Web应用必须能访问到你的本地ADFS服务器。如果ADFS没有公网地址,你需要通过Azure VPN网关或者ExpressRoute建立Azure和本地网络的私有连接,否则认证流程会失败。
- 证书信任:ADFS会用证书签名身份断言,你需要确保Azure Web应用信任ADFS的签名证书——可以把证书导入到应用的信任存储,或者在代码中配置信任该证书。
- 声明映射:根据业务需求,在ADFS中配置需要传递给应用的用户声明,比如角色、部门等,然后在应用中解析这些声明来实现授权逻辑。
内容的提问来源于stack exchange,提问作者pavan
相关产品推荐
相关产品推荐

