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

无需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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:10:12