You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Visual Studio创建Azure部署Web API:认证选项异常及权限管控咨询

问题解答

一、Visual Studio认证选项仅显示云存储的原因及解决办法

你遇到的这个情况是因为在VS 15.5.4对应的ASP.NET Core 2.x版本中,"Individual User Accounts"模板默认只提供连接云用户存储的选项——本地Identity用户存储需要手动添加配置,而非通过模板向导直接选择。

不过这里要提醒你:你的场景其实不需要用户登录的身份系统,因为你要限制的是调用API的客户端(你的Web应用),而非终端用户。所以本地Identity配置对你的核心需求来说不是必须的,接下来重点讲客户端权限管控的可行方案。

如果之后确实需要本地用户存储,你可以按以下步骤手动配置:

  • 先创建一个选择"无认证"的Web API项目
  • 安装NuGet包:Microsoft.AspNetCore.Identity.EntityFrameworkCore 和对应数据库提供商的包(比如Microsoft.EntityFrameworkCore.SqlServer
  • 创建ApplicationUser类继承IdentityUserApplicationDbContext继承IdentityDbContext<ApplicationUser>
  • 在启动类(Startup.cs)中配置Identity和数据库上下文服务,最后迁移数据库生成身份相关表

二、实现仅指定Web应用可调用API的权限管控

因为是服务间的调用(Web应用→Web API,无终端用户参与),推荐两种方案,你可以根据场景选择:

方案1:API密钥认证(简单易上手,适合小型场景)

这是最直接的方式,快速实现客户端验证:

  1. 在API的appsettings.json中定义合法的API密钥(建议用Azure Key Vault存储,不要硬编码):
    "ApiKeys": {
      "ValidKeys": ["YourSecureKey_2024!", "BackupValidKey_XXX"]
    }
    
  2. 自定义一个API密钥授权过滤器:
    public class ApiKeyAuthorizationFilter : IAuthorizationFilter
    {
        private readonly IConfiguration _config;
    
        public ApiKeyAuthorizationFilter(IConfiguration config)
        {
            _config = config;
        }
    
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            // 从请求头获取API密钥
            if (!context.HttpContext.Request.Headers.TryGetValue("X-Api-Key", out var apiKey))
            {
                context.Result = new UnauthorizedResult();
                return;
            }
    
            // 验证密钥是否合法
            var validKeys = _config.GetSection("ApiKeys:ValidKeys").Get<string[]>();
            if (!validKeys.Contains(apiKey))
            {
                context.Result = new UnauthorizedResult();
            }
        }
    }
    
  3. 在API中注册过滤器:
    • 全局注册(所有接口生效):
      services.AddControllers(options =>
      {
          options.Filters.Add<ApiKeyAuthorizationFilter>();
      });
      
    • 单个控制器注册:
      [ServiceFilter(typeof(ApiKeyAuthorizationFilter))]
      [ApiController]
      [Route("api/[controller]")]
      public class DataCollectController : ControllerBase
      {
          // 接口逻辑
      }
      
  4. 在你的Web应用中,调用API时在请求头带上X-Api-Key: YourSecureKey_2024!即可。

方案2:Azure AD客户端凭据流(企业级推荐,适合Azure部署场景)

如果你的应用部署在Azure环境,用Azure AD服务主体实现服务间认证更安全,还能集中管理权限:

  1. 在Azure AD中创建两个应用注册:一个对应你的Web API,一个对应你的Web应用(客户端)
  2. 给Web API定义一个应用范围(比如api://your-api-client-id/access_as_app
  3. 给Web应用(客户端)授予访问Web API的应用权限(不要选委托权限,因为是服务间调用),并完成管理员同意
  4. 在Web API中配置Azure AD认证:
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));
    
    对应的appsettings.json配置:
    "AzureAd": {
      "Instance": "https://login.microsoftonline.com/",
      "TenantId": "你的租户ID",
      "ClientId": "你的API应用ID",
      "Audience": "api://你的API应用ID"
    }
    
  5. 在Web应用中,用客户端凭据流获取访问令牌,再调用API:
    var clientCredential = new ClientCredential("客户端应用ID", "客户端密钥");
    var authContext = new AuthenticationContext($"https://login.microsoftonline.com/{你的租户ID}");
    var tokenResult = await authContext.AcquireTokenAsync("api://你的API应用ID", clientCredential);
    
    // 调用API时携带令牌
    var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.AccessToken);
    var response = await httpClient.PostAsync("你的API接口地址", content);
    

这种方案支持密钥旋转、权限撤销等企业级管理操作,安全性更高。


内容的提问来源于stack exchange,提问作者Kirsten

火山引擎 最新活动