承载错误=“invalid_token”通过MSAL Microsoft Azure使用Swagger授权后签名无效

ru9i0ody  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(166)

我正在尝试在通过MSAL进行身份验证后调用天气预报终结点。(使用Microsoft标识在Swagger中启用用户身份验证)
根据本条。
https://www.josephguadagno.net/2022/06/03/enabling-user-authentication-in-swagger-using-microsoft-identity
我已经使用VS 2022创建了一个默认的身份链接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"}
            }
        }
    }
});

我设法通过微软API授权,swagger说我被授权了。但是当我试图调用天气预报api时-我仍然得到401。

任何帮助都将是惊人的。我不知道下一步该尝试什么。
编辑。我试图删除MS Graph(useriderread)的作用域,只是为我的客户端调用API,我得到了403错误。
但是API肯定在那里

我希望在调用天气预报端点时看到数据和返回的200。

fkvaft9z

fkvaft9z1#

我相信解码的令牌可以解释错误消息,令牌有"scp": "User.Read profile openid email",而您的API的正确范围应该是"scp": "api://29867508-2243-4ae2-9e04-c740dfe793a2/access_as_user"
原因是,您同时设置了图形API权限(用户.读取)和自定义api权限。他们有不同的受众,所以令牌只能为其中一个api权限生成。我担心如果您像下面这样写将工作(只是调整顺序,因为当有2种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" },
            },

顺便说一下,我很久以前就有同样的要求。

相关问题