VSCode Entra ID 登录配置全攻略(从零到上线的完整实践路径)

第一章:VSCode Entra ID 登录配置全攻略(从零到上线的完整实践路径)

在现代企业开发环境中,统一身份认证已成为提升安全性和协作效率的关键环节。使用 VSCode 配合 Microsoft Entra ID(前身为 Azure AD)实现安全登录,不仅能够集中管理开发者访问权限,还能无缝集成 DevOps 工具链。

准备工作与环境要求

  • 已安装最新版 Visual Studio Code
  • 拥有 Microsoft Entra ID 租户管理员权限
  • 已注册的应用注册权限
  • 启用多因素认证(MFA)推荐以增强安全性

注册应用并配置重定向 URI

登录 Azure 门户,在“Microsoft Entra ID”中创建新应用注册:
  1. 进入“应用注册” → “新注册”
  2. 输入名称,例如 vscode-entra-login
  3. 选择“单租户”或“多租户”根据需求
  4. 在“认证”选项卡中添加重定向 URI:
    vscode://microsoft-authentication

配置 VSCode 使用 Entra ID 认证

安装官方扩展“Microsoft Authentication”,该扩展支持 Entra ID 账号绑定。
// settings.json 中可选配置
{
  "github.gitAuthentication": false,
  "azure.account.authenticationProviders": {
    "azure": {
      "name": "Azure",
      "clientId": "你的应用客户端ID",
      "tenant": "common" // 或指定租户ID
    }
  }
}
执行登录时,VSCode 将通过系统浏览器跳转至 Entra ID 登录页,完成身份验证后返回授权令牌。

权限分配与角色管理

为确保最小权限原则,建议通过以下表格定义角色映射:
用户角色Entra ID 组授予的资源权限
开发者DevTeam仅读取代码仓库
管理员DevOpsAdmins部署、配置、密钥访问
graph TD A[启动 VSCode] --> B{检测登录状态} B -->|未登录| C[触发 Entra ID 认证流程] C --> D[浏览器跳转授权] D --> E[获取访问令牌] E --> F[建立安全会话] F --> G[加载受保护资源]

第二章:Entra ID 基础与开发环境准备

2.1 理解 Entra ID 的身份认证机制与核心概念

Entra ID(前身为 Azure Active Directory)是微软提供的云身份和访问管理服务,其核心在于统一身份验证与授权机制。它支持多种认证协议,如 OAuth 2.0、OpenID Connect 和 SAML,实现用户单点登录(SSO)和多因素认证(MFA)。
身份认证流程示例

GET https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=6d8fdded-157e-4bba-8a32-1f4a76b68a00
&response_type=code
&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback
&scope=User.Read
&state=12345
该请求引导用户至登录页面,参数 client_id 标识应用,scope 定义权限范围,授权服务器返回授权码后,应用可交换访问令牌。
核心概念对照表
概念说明
租户(Tenant)组织级别的隔离实例,包含用户、应用和策略
主体(Principal)代表用户、服务或应用程序的安全实体
应用注册在租户中声明应用元数据与权限需求

2.2 在 Azure 门户中注册 VSCode 应用lications

在使用 Visual Studio Code 与 Azure 资源交互前,需在 Azure 门户中注册应用以获取身份认证支持。
创建应用注册
登录 Azure 门户,导航至“Azure Active Directory” > “应用注册” > “新注册”。输入应用名称(如 VSCode-DevTool),选择“单租户”或“多租户”支持,设置重定向 URI 为 http://localhost:8080
配置权限与密钥
注册完成后,记下“应用程序(客户端)ID”和“目录(租户)ID”。在“证书与密码”中创建客户端密钥,并保存生成的密钥值。
代码示例:认证配置
{
  "clientId": "your-client-id",
  "tenantId": "your-tenant-id",
  "clientSecret": "your-client-secret"
}
该配置用于在 VSCode 扩展中通过 Microsoft Identity Platform 获取访问令牌,实现对 Azure 资源的安全调用。参数必须与门户注册信息严格一致。

2.3 配置应用的权限请求与重定向 URI

在OAuth 2.0认证流程中,正确配置权限范围(scopes)和重定向URI是确保安全授权的关键步骤。
权限请求范围配置
应用需明确声明所需访问权限,常见权限包括:
  • profile:获取用户基本信息
  • email:访问用户邮箱地址
  • offline_access:获取刷新令牌以支持长期访问
重定向URI的安全设置
重定向URI必须预先在开发者平台注册,防止开放重定向攻击。支持多个合法回调地址,例如:
环境重定向URI
开发http://localhost:3000/auth/callback
生产https://app.example.com/auth/callback
// 示例:构建授权请求URL
authURL := fmt.Sprintf(
  "https://idp.example.com/authorize?client_id=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s",
  clientID,
  url.QueryEscape("https://app.example.com/auth/callback"),
  url.QueryEscape("profile email offline_access"),
  generateState(),
)
该代码拼接标准OAuth 2.0授权链接,scope参数指定多权限空格分隔,redirect_uri必须完全匹配预注册地址,state用于防御CSRF攻击。

2.4 安装并初始化 Microsoft Authentication Library (MSAL)

在构建与 Microsoft Entra ID 集成的应用程序时,MSAL 是实现安全身份验证的核心组件。它支持多种平台,并提供统一的编程模型来获取访问令牌。
安装 MSAL 包
使用 npm 安装适用于 JavaScript 的 MSAL 库:

npm install @azure/msal-browser
该命令将下载 MSAL 浏览器库,为单页应用(SPA)提供基于 OAuth 2.0 的认证能力。安装完成后,可在项目中导入 PublicClientApplication 类以初始化配置。
初始化 MSAL 实例
创建 MSAL 配置对象并实例化客户端:

import { PublicClientApplication } from '@azure/msal-browser';

const msalConfig = {
  auth: {
    clientId: 'your-client-id',
    authority: 'https://login.microsoftonline.com/your-tenant-id',
    redirectUri: 'http://localhost:3000'
  },
  cache: {
    cacheLocation: 'sessionStorage',
    storeAuthStateInCookie: true
  }
};

const msalInstance = new PublicClientApplication(msalConfig);
上述代码中,clientId 对应 Azure 注册的应用程序 ID,authority 指定身份验证终结点,而 redirectUri 必须与门户中注册的重定向地址一致。cacheLocation 设置为 sessionStorage 可提升安全性,避免跨标签干扰。

2.5 验证本地开发环境的网络与凭据安全性

在本地开发环境中,确保网络通信和身份凭据的安全性是防止敏感数据泄露的第一道防线。开发者应定期检查系统是否暴露于公共网络,并验证认证机制的有效性。
网络连接安全检查
使用 netstat 命令可查看当前监听端口,识别潜在风险服务:
netstat -tuln | grep LISTEN
该命令列出所有正在监听的网络连接。若发现非必要的开放端口(如数据库默认端口 3306 或 6379),应及时关闭或限制访问范围。
凭据管理最佳实践
敏感凭据不应硬编码在代码中。推荐使用环境变量存储:
  • 通过 .env 文件管理配置(需加入 .gitignore
  • 使用 os.Getenv("DB_PASSWORD") 动态读取
  • 结合 Vault 等工具实现加密存储与动态分发
HTTPS 与本地证书验证
开发中模拟 TLS 通信时,应生成自签名证书并配置本地信任,避免“绕过证书验证”成为习惯性反模式。

第三章:VSCode 插件集成与身份验证实现

3.1 开发支持 Entra ID 登录的 VSCode 扩展基础结构

构建支持 Entra ID 认证的 VSCode 扩展,首先需在 `package.json` 中声明扩展的基本元信息与激活事件。其中,`authentication` 贡献点用于注册身份提供者。
{
  "contributes": {
    "authentication": {
      "providers": [{
        "id": "contoso-auth",
        "label": "Contoso Entra Login"
      }]
    }
  },
  "activationEvents": [
    "onAuthenticationRequest:contoso-auth"
  ]
}
上述配置定义了一个名为 `contoso-auth` 的认证服务,当用户请求登录时,VSCode 将激活扩展并调用对应的提供者实现。`onAuthenticationRequest` 确保仅在需要认证时加载扩展,提升性能。
核心模块组织
扩展主文件需实现 `AuthenticationProvider` 接口,包含 `getSession`、`createSession` 和 `removeSession` 方法。通过监听 `onDidChangeSessions` 事件,通知 UI 更新登录状态。
  • 使用 MSAL Node 获取 OAuth2.0 授权码
  • 会话数据加密存储于 VSCode Secrets API
  • 令牌刷新逻辑集成在后台任务中

3.2 实现登录触发逻辑与令牌获取流程

在现代认证体系中,登录触发与令牌获取是身份鉴权的第一道关卡。用户发起登录请求后,系统需验证凭证并调用认证接口获取访问令牌(Access Token)。
登录事件监听机制
前端通过事件绑定捕获用户登录动作,触发认证流程:

document.getElementById('loginBtn').addEventListener('click', async () => {
  const username = document.getElementById('username').value;
  const password = document.getElementById('password').value;
  // 调用登录服务,提交凭证
  const response = await fetch('/api/auth/login', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username, password })
  });
  const data = await response.json();
  localStorage.setItem('accessToken', data.token); // 存储令牌
});
上述代码实现点击登录后向后端提交用户名密码,并将返回的 token 存入本地存储,供后续请求使用。
令牌获取流程步骤
  1. 用户输入凭证并提交
  2. 客户端加密传输至认证服务器
  3. 服务器验证凭据,生成 JWT 令牌
  4. 返回包含 token 和过期时间的响应
  5. 客户端持久化存储并设置拦截器自动附加 Authorization 头

3.3 处理用户会话管理与登出操作

在现代Web应用中,安全的用户会话管理是保障系统安全的核心环节。登出操作不仅要清除客户端状态,还需确保服务器端会话无效化,防止会话劫持。
会话销毁流程
登出请求触发后,服务端应立即删除对应会话存储,并使会话令牌失效:
func logoutHandler(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session-name")
    session.Options.MaxAge = -1 // 标记为过期
    session.Save(r, w)
}
该代码将会话的 MaxAge 设为 -1,通知客户端立即删除 Cookie,同时服务端同步清理会话数据。
多设备登出策略
  • 单点登录(SSO)场景下,登出需广播至所有关联终端
  • 使用 JWT 时,可维护黑名单机制拦截已登出令牌
  • 结合 Redis 存储会话状态,实现毫秒级失效控制

第四章:权限控制与生产环境部署优化

4.1 基于角色的访问控制(RBAC)在插件中的落地

在插件化系统中,基于角色的访问控制(RBAC)是保障模块间安全调用的核心机制。通过将权限与角色绑定,再将角色分配给用户或插件实例,实现灵活且可扩展的权限管理。
核心模型设计
典型的 RBAC 模型包含用户、角色、权限三要素。在插件环境中,插件实例可视为“用户”,其运行时被赋予特定角色。
角色允许操作作用域
readerGET /data只读数据接口
writerPOST /data, PUT /data读写数据接口
权限校验代码实现
func (p *Plugin) CheckAccess(role string, action string) bool {
    permissions := map[string][]string{
        "reader": {"GET"},
        "writer": {"GET", "POST", "PUT"},
    }
    for _, act := range permissions[role] {
        if act == action {
            return true
        }
    }
    return false
}
该函数根据插件当前角色查询其允许的操作列表,进行字符串匹配完成校验。映射结构确保 O(1) 级别查询效率,适用于高频调用场景。

4.2 敏感信息保护与安全存储最佳实践

加密存储策略
敏感数据在持久化时必须加密。推荐使用AES-256算法对字段级数据加密,密钥由KMS统一管理。
// 示例:使用Go进行AES加密
func Encrypt(data, key []byte) ([]byte, error) {
    block, _ := aes.NewCipher(key)
    ciphertext := make([]byte, aes.BlockSize+len(data))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return nil, err
    }
    mode := cipher.NewCBCEncrypter(block, iv)
    mode.CryptBlocks(ciphertext[aes.BlockSize:], data)
    return ciphertext, nil
}
该函数通过CBC模式加密数据,IV随机生成确保相同明文每次加密结果不同,提升安全性。
密钥管理规范
  • 禁止硬编码密钥于源码中
  • 使用环境变量或专用密钥管理系统(如Hashicorp Vault)加载密钥
  • 定期轮换加密密钥并记录审计日志

4.3 日志追踪与认证失败问题排查方案

在分布式系统中,认证失败的根因分析常受跨服务调用影响。通过统一日志标识(Trace ID)串联请求链路,可快速定位异常节点。
日志上下文关联
为每个请求生成唯一 Trace ID,并注入到 HTTP Header 中:
// Go 中间件示例:注入 Trace ID
func TraceMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        traceID := r.Header.Get("X-Trace-ID")
        if traceID == "" {
            traceID = uuid.New().String()
        }
        ctx := context.WithValue(r.Context(), "trace_id", traceID)
        w.Header().Set("X-Trace-ID", traceID)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}
该中间件确保所有服务记录日志时携带相同 Trace ID,便于聚合检索。
常见认证失败场景
  • Token 过期或签名不匹配
  • OAuth2 范围不足(Insufficient Scope)
  • JWT 解析失败导致匿名访问被拒
结合日志与认证服务器审计记录,可构建完整验证路径,提升排障效率。

4.4 高可用性设计与多租户支持策略

在构建云原生平台时,高可用性与多租户隔离是核心架构目标。通过分布式服务部署与负载均衡机制,系统可实现故障自动转移,保障服务连续性。
数据同步机制
采用基于事件驱动的异步复制策略,确保各节点间状态最终一致:
// 示例:使用消息队列进行配置同步
func OnConfigUpdate(cfg *Config) {
    event := &ConfigEvent{
        ID:      uuid.New(),
        Data:    cfg,
        Version: time.Now().Unix(),
    }
    mq.Publish("config.topic", event) // 发布至广播主题
}
该模式通过解耦配置更新与消费逻辑,提升系统弹性。参数 Version 用于版本控制,避免旧事件覆盖新状态。
多租户资源隔离
  • 命名空间隔离:每个租户独占Kubernetes Namespace
  • 配额管理:通过ResourceQuota限制CPU、内存使用
  • 网络策略:启用NetworkPolicy阻断跨租户访问

第五章:总结与展望

技术演进的现实映射
现代软件架构正从单体向云原生持续演进。以某电商平台为例,其订单系统通过引入Kubernetes进行容器编排,实现了部署效率提升60%。关键配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: order
  template:
    metadata:
      labels:
        app: order
    spec:
      containers:
      - name: order-container
        image: order-service:v1.2
        ports:
        - containerPort: 8080
可观测性的实践深化
在微服务环境中,日志、指标与追踪三位一体已成为运维标配。以下为常用工具组合的实际应用场景:
  • Prometheus:采集服务性能指标,如请求延迟、CPU使用率
  • Loki:聚合结构化日志,支持快速检索异常堆栈
  • Jaeger:实现跨服务链路追踪,定位调用瓶颈
未来能力扩展方向
技术方向当前挑战潜在解决方案
Serverless集成冷启动延迟影响用户体验预热机制 + 持续实例池
AI驱动运维告警噪音高,根因难定位基于LSTM的异常预测模型
架构演进路径图:
单体应用 → 微服务拆分 → 容器化部署 → 服务网格 → 边缘计算协同
基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不依赖物理位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估计与控制。文中结合嵌入式开发平台STM32 F4,采用如滑模观测器、扩展卡尔曼滤波或高频注入法等先进观测技术,实现对电机反电动势或磁链的估算,进而完成无传感器矢量控制(FOC)。同时,研究涵盖系统建模、控制算法设计、仿真验证(可能使用Simulink)以及在STM32硬件平台上的代码实现与调试,旨在提高电机控制系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电力电子、自动控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师。; 使用场景及目标:①掌握永磁同步电机无位置传感器控制的核心原理与实现方法;②学习如何在STM32平台上进行电机控制算法的移植与优化;③为开发高性能、低成本的电机驱动系统提供技术参考与实践指导。; 阅读建议:建议读者结合文中提到的控制理论、仿真模型与实际代码实现进行系统学习,有条件者应在实验平台上进行验证,重点关注观测器设计、参数整定及系统稳定性分析等关键环节。
<think> 我们被要求回答如何在ASP.NET 4.8项目中集成Microsoft Entra ID(原名Azure AD)。根据提供的引用,虽然引用主要针对ASP.NET Core,但我们可以结合引用中的概念和一般性知识来回答。注意:ASP.NET 4.8(即传统的ASP.NET,非Core)的集成方式与ASP.NET Core有所不同。 在ASP.NET 4.8中,我们可以使用Owin中间件来集成Microsoft Entra ID。主要步骤包括: 1. 在Azure门户中注册应用程序。 2. 在项目中安装必要的NuGet包(如Microsoft.Owin.Security.OpenIdConnect, Microsoft.Owin.Security.Cookies等)。 3. 配置Owin启动类,设置OpenID Connect认证中间件。 具体步骤: ### 1. 在Azure门户中注册应用程序 - 登录Azure门户,进入Microsoft Entra ID(或Azure AD)。 - 创建新注册:提供名称,选择支持的账户类型(例如,仅限组织目录中的账户)。 - 注册后,记录应用程序(客户端)ID和目录(租户)ID。 - 在“证书和密码”部分,可以创建客户端密码(如果需要,例如守护程序场景)或上传证书。 - 在“重定向URI”中,添加应用程序登录后重定向的URI(例如:`https://localhost:44300/`,具体端口根据项目)。 ### 2. 创建项目并安装NuGet包 创建一个ASP.NET 4.8项目(例如MVC或Web Forms),然后通过NuGet安装以下包: - Microsoft.Owin.Host.SystemWeb - Microsoft.Owin.Security - Microsoft.Owin.Security.Cookies - Microsoft.Owin.Security.OpenIdConnect - Microsoft.IdentityModel.Protocols.OpenIdConnect ### 3. 配置Owin启动类 在项目中添加一个Owin启动类(通常命名为`Startup.cs`),并配置认证中间件。 ```csharp using Microsoft.Owin; using Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.Cookies; using Microsoft.Owin.Security.OpenIdConnect; using Microsoft.IdentityModel.Protocols; using System.Configuration; using System.Threading.Tasks; [assembly: OwinStartup(typeof(YourNamespace.Startup))] namespace YourNamespace { public class Startup { // 从配置文件中读取设置 private readonly string clientId = ConfigurationManager.AppSettings["ClientId"]; private readonly string tenantId = ConfigurationManager.AppSettings["TenantId"]; private readonly string redirectUri = ConfigurationManager.AppSettings["RedirectUri"]; private readonly string authority = "https://login.microsoftonline.com/{0}/v2.0"; public void Configuration(IAppBuilder app) { // 设置Cookie认证 app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions()); // 配置OpenID Connect认证 app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { ClientId = clientId, Authority = string.Format(authority, tenantId), RedirectUri = redirectUri, PostLogoutRedirectUri = redirectUri, Scope = "openid email profile", // 根据需要添加其他范围 ResponseType = "id_token", // 隐式流返回id_token TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { // 验证令牌的颁发者 ValidIssuer = $"https://sts.windows.net/{tenantId}/" }, Notifications = new OpenIdConnectAuthenticationNotifications { AuthenticationFailed = context => { context.HandleResponse(); context.Response.Redirect("/Error?message=" + context.Exception.Message); return Task.FromResult(0); } } }); } } } ``` ### 4. 修改Web.config 在Web.config的`<appSettings>`中添加配置: ```xml <add key="ClientId" value="你的应用程序(客户端)ID" /> <add key="TenantId" value="你的目录(租户)ID" /> <add key="RedirectUri" value="https://localhost:44300/" /> ``` ### 5. 添加登录和注销功能 在需要的地方(例如在视图或控制器中)添加登录和注销的链接。 登录:可以触发挑战,例如在控制器中: ```csharp public void SignIn() { if (!Request.IsAuthenticated) { // 发送OpenID Connect登录请求 HttpContext.GetOwinContext().Authentication.Challenge( new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType); } } ``` 注销:同样在控制器中: ```csharp public void SignOut() { // 注销本地Cookie并重定向到Microsoft Entra ID注销端点 HttpContext.GetOwinContext().Authentication.SignOut( OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType); } ``` ### 6. 授权 可以使用`[Authorize]`特性来保护控制器或方法。对于基于角色的授权,可以在Microsoft Entra ID中定义应用角色,并将用户分配给这些角色。然后在令牌中会返回角色声明,然后就可以使用`[Authorize(Roles="Admin")]`这样的特性。 注意:在传统ASP.NET中,需要将角色声明转换为ASP.NET能够识别的角色类型。可以在`Global.asax`的`Application_Start`中设置: ```csharp System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier = "http://schemas.microsoft.com/identity/claims/objectidentifier"; ``` 然后在令牌验证时,将角色声明转换为`ClaimsIdentity`的角色声明。通常,在OpenID Connect中间件中,我们可以通过设置`TokenValidationParameters.RoleClaimType`来指定角色声明类型。 ### 注意事项 - 上述示例使用隐式流(返回id_token)进行用户登录。如果应用还需要访问其他API,可能需要使用授权码流(并添加`code`响应类型)以获取访问令牌。 - 在生产环境中,应使用HTTPS,并确保重定向URI已正确注册。 以上是在ASP.NET 4.8中集成Microsoft Entra ID进行身份验证的基本步骤。具体细节可能需要根据实际需求调整。 §§相关问题§§ 1. 在ASP.NET 4.8中集成Microsoft Entra ID时,如何处理角色授权? 2. 如何在Microsoft Entra ID中为应用程序配置应用角色? 3. 在ASP.NET 4.8中,如何获取用户的访问令牌以调用其他受保护的API? </think> ### 在 ASP.NET 4.8 中集成 Microsoft Entra ID 的步骤 #### 1. **在 Azure 门户注册应用程序** - 登录 [Azure 门户](https://portal.azure.com),进入 **Microsoft Entra ID**(原 Azure AD) - 选择 **应用注册** → **新注册** - 填写应用名称(如 `MyAspNetApp`),选择 **账户类型**(如 "仅此组织目录") - 设置 **重定向 URI**:选择 **Web** 类型,输入 `https://localhost:{端口}/signin-oidc`(端口需与本地 IIS Express 一致) - 记录 **应用程序(客户端)ID** 和 **目录(租户)ID**[^3] #### 2. **配置项目 NuGet 包** 在 Visual Studio 中安装必要包: ```powershell Install-Package Microsoft.Owin.Security.OpenIdConnect Install-Package Microsoft.Owin.Security.Cookies Install-Package Microsoft.Owin.Host.SystemWeb ``` #### 3. **添加 OWIN 启动配置** 创建 `Startup.cs` 文件,配置认证中间件: ```csharp using Microsoft.Owin; using Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.Cookies; using Microsoft.Owin.Security.OpenIdConnect; [assembly: OwinStartup(typeof(MyNamespace.Startup))] namespace MyNamespace { public class Startup { public void Configuration(IAppBuilder app) { // Cookie 认证设置 app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions()); // OpenID Connect 配置 var clientId = "你的客户端ID"; var tenantId = "你的租户ID"; var authority = $"https://login.microsoftonline.com/{tenantId}/v2.0"; app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { ClientId = clientId, Authority = authority, RedirectUri = "https://localhost:44300/", // 匹配 Azure 设置 PostLogoutRedirectUri = "https://localhost:44300/", Scope = "openid profile email", ResponseType = "id_token", TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidIssuer = authority }, Notifications = new OpenIdConnectAuthenticationNotifications() }); } } } ``` #### 4. **保护路由** 在控制器或 Action 上添加 `[Authorize]` 特性: ```csharp [Authorize] public class SecureController : Controller { // 仅认证用户可访问 public ActionResult Index() { var userName = User.Identity.Name; return View(); } } ``` #### 5. **配置 Web.config** 添加以下配置节: ```xml <system.web> <authentication mode="None" /> <!-- 禁用传统认证 --> </system.web> <appSettings> <add key="ida:ClientId" value="你的客户端ID" /> <add key="ida:TenantId" value="你的租户ID" /> </appSettings> ``` #### 6. **处理登入/登出** 添加登录按钮(视图示例): ```html @if (!User.Identity.IsAuthenticated) { <a href="/Account/Login">使用 Microsoft Entra ID 登录</a> } else { <a href="/Account/Logout">注销</a> } ``` 控制器方法: ```csharp public class AccountController : Controller { public void Login() { if (!Request.IsAuthenticated) { HttpContext.GetOwinContext().Authentication.Challenge( new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType); } } public void Logout() { HttpContext.GetOwinContext().Authentication.SignOut( OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType); } } ``` #### 7. **测试与部署** - 本地测试:按 F5 启动调试,点击登录按钮应跳转至 Microsoft 登录页 - 生产部署: 1. 在 Azure 应用注册中更新 **重定向 URI**(如 `https://生产域名/signin-oidc`) 2. 发布项目到 IIS 服务器 3. 确保服务器时间与 Azure 时间同步 > **注意**:ASP.NET 4.x 使用 OWIN 中间件集成,与 ASP.NET Core 的配置方式不同[^1][^2]。若需高级功能(如角色授权),需在 Azure 门户配置 **应用角色** 并在令牌中返回角色声明[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值