gpt4 book ai didi

c# - ASP.NET Core 2.0 Web API Azure Ad v2 token 授权不起作用

转载 作者:行者123 更新时间:2023-11-30 16:41:51 30 4
gpt4 key购买 nike

我正在尝试使用 ASP.NET Core 2.0 创建一个 Web API 服务器,它使用 azure ad v2 端点 token 授权。我还有一个 Angular 2 应用程序,可在其中进行 office365 登录。我从那里获得一个 token ,然后向 Web API 服务器中的授权操作发送一个简单的请求。但是我的 token 没有通过授权检查,我收到了 401 Unauthorized 响应。提供的描述是:

Bearer error="invalid_token", error_description="The signature key was not found"

我解码了 token ,解码器也抛出无效签名错误。以下是我用于配置和 token 授权的代码的重要部分:

网络 API 服务器:

appsettings.json

{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "my-registered-app-client-id",
},
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
}
}

AzureAdAuthenticationBuilderExtensions.cs

public static class AzureAdServiceCollectionExtensions
{
public static AuthenticationBuilder AddAzureAdBearer(this AuthenticationBuilder builder)
=> builder.AddAzureAdBearer(_ => { });

public static AuthenticationBuilder AddAzureAdBearer(this AuthenticationBuilder builder, Action<AzureAdOptions> configureOptions)
{
builder.Services.Configure(configureOptions);
builder.Services.AddSingleton<IConfigureOptions<JwtBearerOptions>, ConfigureAzureOptions>();
builder.AddJwtBearer();
return builder;
}

private class ConfigureAzureOptions: IConfigureNamedOptions<JwtBearerOptions>
{
private readonly AzureAdOptions _azureOptions;

public ConfigureAzureOptions(IOptions<AzureAdOptions> azureOptions)
{
_azureOptions = azureOptions.Value;
}

public void Configure(string name, JwtBearerOptions options)
{
options.Audience = _azureOptions.ClientId;
options.Authority = $"{_azureOptions.Instance}common/v2.0";

options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
};
}

public void Configure(JwtBearerOptions options)
{
Configure(Options.DefaultName, options);
}
}
}

Startup.cs

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddAzureAdBearer(options => Configuration.Bind("AzureAd", options));

services.AddMvc();
services.AddCors(options =>
{
options.AddPolicy("AllowAllOrigins",
builder =>
{
builder.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
});
});
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseCors("AllowAllOrigins");

app.UseAuthentication();
app.UseMvc();
}
}

下面是我用于在我的 Angular2 应用程序中进行身份验证的代码:

import { Injectable } from '@angular/core';
import { Headers } from '@angular/http';
import * as hello from 'hellojs/dist/hello.all.js';

import * as MicrosoftGraph from "@microsoft/microsoft-graph-types";
import * as MicrosoftGraphClient from "@microsoft/microsoft-graph-client";
import { Configs } from "../../../shared/configs"

@Injectable()
export class HttpService {
url = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${Configs.appId}&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&response_mode=query&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fmail.read&state=12345`;

getAccessToken() {
const msft = hello('msft').getAuthResponse();
const accessToken = msft.access_token;
return accessToken;
}


getClient(): MicrosoftGraphClient.Client
{
var client = MicrosoftGraphClient.Client.init({
authProvider: (done) => {
done(null, this.getAccessToken()); //first parameter takes an error if you can't get an access token
},
defaultVersion: 'v2.0'
});
return client;
}
}

当从端点返回 token 时,我将请求发送到我的 Web API 服务器上的有效端点。

重要说明:我在 Web API 和 Angular 应用程序中使用相同的 AppId,因为 AzureAd v2.0 端点需要它。

我的观点是,我认为我所做的一切都是按照书本进行的,但显然缺少某些东西。如果有人能告诉我我在配置中做错了什么,我将感激不尽!

解码 token 的 aud 属性是:

https://graph.microsoft.com

最佳答案

在评论中进行了不那么简短的讨论后,问题得到了解决。

讨论要点:

  • 访问 token 包含一个 aud 声明,其值为 https://graph.microsoft.com,这意味着该 token 适用于 Microsoft Graph API,不是他们的 API
  • Web API 需要在 https://apps.dev.microsoft.com/ 注册,之后应用需要使用类似于以下的 scope 请求访问 token :api://25f66106-edd6-4724-ae6f-3a204cfd9f63/access_as_user

因此请确保 aud 声明包含您的 API 的客户端 ID 或应用 ID URI。这意味着它适用于您的 API。

token 还需要包含必要的范围。

从 AAD 请求访问 token 时,请确保您指定了正确的范围。

此外,如果您使用的是 v1 终结点,请确保使用 ADAL,而不是 MSAL。在 v1 中,您还必须使用 resource 而不是范围,它的值必须设置为 API 的客户端 ID 或应用程序 ID URI。

关于c# - ASP.NET Core 2.0 Web API Azure Ad v2 token 授权不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47953476/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com