Postman无法访问AAD保护的Asp.net core 3.1 restapi。401未授权

我通过以下步骤设置了一个AAD保护的asp.net core 3.1 restapi web服务。

  1. 注册一个服务器应用程序(HelloWorld),然后添加一个作用域。

  2. 注册一个客户端应用(domino-client)并创建一个秘密。然后添加服务器应用权限。

  3. 在asp.net core中添加AAD auth。我创建了一个rest api项目,并做了如下修改。(配置auth相关服务和中间件。配置控制器。)

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddAuthentication(o =>
            {
                o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(o =>
            {
                o.Authority = "https://login.microsoftonline.com/{tenant_id}";
                o.Audience = "a1faffea-24c6-42ff-9586-ee86ec7b8e80";          // server app client id
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthentication();  // Add aad auth.

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    [Authorize]  // Enable auth.
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
          .....
        }
    }

  1. 然后尝试使用postman来访问api。

访问令牌时的一些参数。

  • 访问令牌的网址。从 端点
  • 客户端ID:客户端app客户端ID
  • 客户端秘密:客户端应用秘密
  • scope: server app scope

Howerer,我得到401未授权的错误。是不是程序出了什么问题?

解决方案:

根据你提供的细节,你想使用 OAuth 2.0客户端证书流程 来访问受 Azure AD 保护的 API。如果是这样,您需要定义 应用程式角色 而不是服务器应用程序中的 scope。

详细步骤如下

  1. 创建服务器应用程序

  2. 定义应用角色

    a. 选择您要定义应用程序角色的应用程序。然后选择 宣言.

    b. 编辑应用程序清单,找到 appRoles 设置并添加所有的应用程序角色。它应该像下面这样

    "appRoles": [
    {
    "allowedMemberTypes": [
      "Application"
    ],
    "displayName": "access the web api",
    "id": "47fbb575-859a-4941-89c9-0f7a6c30beac",
    "isEnabled": true,
    "description": "Consumer apps have access to web api.",
    "value": "Consumer"
    }
    ],
    
  3. 注册一个客户端应用并创建一个秘密。

  4. 为您的客户端应用程序添加应用程序角色enter image description here

  5. 配置网络API

    a. Startup.cs

    public void ConfigureServices(IServiceCollection services)
      {
    services.AddAuthentication(x =>
          {
              x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
              x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
          })
        .AddJwtBearer(x =>
        {
            x.Authority = "https://login.microsoftonline.com/<tenant id>/v2.0";
            x.TokenValidationParameters = new TokenValidationParameters
            {
    
                ValidateIssuer = false,
                 ValidAudiences = new[] {"<app id>","<app id url>" }
            };
        });
          services.AddControllers();
      }
      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
          if (env.IsDevelopment())
          {
              app.UseDeveloperExceptionPage();
          }
    
          app.UseHttpsRedirection();
    
          app.UseRouting();
    
          app.UseAuthentication();
          app.UseAuthorization();
    
          app.UseEndpoints(endpoints =>
          {
              endpoints.MapControllers();
          });
      }
    

    b. 添加 [Authorize] 在您的API控制器中启用认证

  6. 用邮递员测试

    a. 获取访问令牌 enter image description here

    b. 调用API enter image description here

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何使用Devextreme Angular文件上传器而不将数据上传到服务器上?

2022-9-8 16:19:42

未分类

在大查询中创建表

2022-9-8 16:30:35

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索