我正在尝试通过 MSAL 进行身份验证后调用天气预报端点。 (使用 Microsoft Identity 在 Swagger 中启用用户身份验证)
根据这篇文章。
我已经使用 VS2022 创建了一个默认的身份链接 API。我已经在 Azure 上配置了我的客户端。 我的代码的区别如下
s.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OAuth2,
Flows = new OpenApiOAuthFlows
{
Implicit = new OpenApiOAuthFlow()
{
AuthorizationUrl = new Uri("https://login.microsoftonline.com/common/oauth2/v2.0/authorize"),
TokenUrl = new Uri("https://login.microsoftonline.com/common/common/v2.0/token"),
Scopes = new Dictionary<string, string>() {
{ "user.read", "Access App Graph" },
{ "api://29867508-2243-4ae2-9e04-c740dfe793a2/access_as_user","Access my Api stuff on my Client"}
}
}
}
});
我设法通过 Microsoft Api 进行授权,并且大摇大摆地说我已获得授权。 但是当我尝试调用天气预报 api 时 - 我仍然收到 401。
任何帮助都会很棒。我不知道接下来要尝试什么。
编辑。我试图删除 MS Graph (user.read) 的范围并为我的客户端调用 API,我收到 403 错误。
但是api肯定是有的
我期待在调用天气预报端点时看到数据和返回 200。
我相信解码后的令牌可以解释错误消息,令牌有
"scp": "User.Read profile openid email"
而您的api的正确范围应该是"scp": "api://29867508-2243-4ae2-9e04-c740dfe793a2/access_as_user"
.
原因是,你同时设置了graph api权限(User.Read)和你的自定义api权限。他们有不同的受众,因此令牌只能为其中一种 api 权限生成。恐怕如果你像下面这样写就可以了(只需调整顺序,因为当有两种 api 权限时,它会为第一种 api 权限生成令牌)。
Scopes = new Dictionary<string, string>() {
{ "api://29867508-2243-4ae2-9e04-c740dfe793a2/access_as_user","Access my Api stuff on my Client"}
{ "user.read", "Access App Graph" },
},
顺便说一句,我很久以前有一个测试有同样的要求。