.NET4.7.2 ASP.NET应用(Azure托管)如何实现Azure AD WS-Federation认证
为Azure App Service上的ASP.NET 4.7.2应用配置Azure AD WS-Federation认证
一、Azure AD应用注册与配置
- 登录Azure Portal,进入Azure Active Directory → 应用注册 → 新注册
- 填写应用名称,账户类型选「仅此组织目录中的账户」,注册后记录客户端ID和租户ID
- 进入该应用的「身份验证」→ 添加平台 → 选择「Web」
- 重定向URI填入你的App Service域名+
/wsfed(例:https://yourapp.azurewebsites.net/wsfed) - 开启「允许隐式流」的「ID令牌」,保存配置
- 重定向URI填入你的App Service域名+
- 进入应用的「端点」,复制「WS-Federation 元数据文档」链接,备用
- (可选)进入「企业应用程序」找到该应用,在「用户和组」中添加允许访问的用户/组
二、Azure App Service启用认证
- 打开你的App Service资源 → 身份验证 → 添加身份提供者
- 选择「Microsoft」,关联刚才注册的应用(或手动填入租户ID、客户端ID)
- 未认证请求处理选「HTTP 302 重定向到登录页」,完成添加
三、ASP.NET 4.7.2应用代码配置
- 安装NuGet包
- 在Visual Studio中为项目安装
Microsoft.Owin.Security.WsFederation和Microsoft.Owin.Host.SystemWeb
- 在Visual Studio中为项目安装
- 添加OWIN启动类
- 项目根目录新建
Startup.cs,代码如下:using Microsoft.Owin; using Owin; using Microsoft.Owin.Security.WsFederation; using System.Configuration; [assembly: OwinStartup(typeof(YourApp.Startup))] namespace YourApp { public class Startup { public void Configuration(IAppBuilder app) { // 配置WS-Federation认证 app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions { MetadataAddress = ConfigurationManager.AppSettings["WsFedMetadataUrl"], Wtrealm = ConfigurationManager.AppSettings["WsFedRealm"], CallbackPath = new PathString("/wsfed"), SignInAsAuthenticationType = "Cookies" }); // 启用Cookie认证存储身份信息 app.UseCookieAuthentication(new Microsoft.Owin.Security.Cookies.CookieAuthenticationOptions { AuthenticationType = "Cookies" }); } } }
- 项目根目录新建
- 修改Web.config
- 在
<appSettings>中添加:<add key="WsFedMetadataUrl" value="你复制的WS-Federation元数据链接" /> <add key="WsFedRealm" value="你的App Service域名" /> - 将
<system.web>下的authentication模式改为None:<authentication mode="None" /> - 若要强制所有用户认证后访问,添加:
<authorization> <deny users="?" /> </authorization>
- 在
四、测试与验证
- 发布应用到App Service,访问域名会自动跳转到Azure AD登录页,登录后即可进入应用
- 代码中可通过
HttpContext.Current.User.Identity获取用户信息,示例:var userEmail = HttpContext.Current.User.Identity.Name; var userId = ((System.Security.Claims.ClaimsIdentity)HttpContext.Current.User.Identity) .FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
内容的提问来源于stack exchange,提问作者Rishu
相关产品推荐
相关产品推荐

