使用 Azure AD 保护 .NET Framework Web API(客户端凭据流)
Securing .NET Framework Web API with Azure AD (Client credentials flow)
我有一个 .NET 4.7 Web API 项目(不是 .NET CORE)。
我正在尝试使用 Azure AD 目录设置身份验证,我在我的 AD 中设置了一个应用程序,并获得了客户端 ID(应用程序 ID)
我想使用 Client Credentials 授权类型。所以我继续通过访问令牌 URL https://login.microsoftonline.com/HIDDEN/oauth2/v2.0/token 检索令牌 我正在传递客户端 ID 和秘密,为此我使用 Postman
现在在我的项目中,我在我的 web api 项目中实现了以下逻辑:
var clientId = "AZURE APPLICATION ID";
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AllowedAudiences = new List<string> { clientId },
TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false,
ValidAudience = clientId
}
});
在我的控制器上,我应用了 [Authorize] 属性
当调用 API 控制器端点时(确保我正在传递值为“Bearer MYTOKEN”的授权 header),我收到 Postman 返回的错误:
“消息”:“此请求的授权已被拒绝。”
有什么方法可以让我更深入地找出问题所在?
我在 visual studio 中的输出 window 中没有看到任何内容,是否有一些事件我可以关联到失败的原因?
编辑:根据 Carl 添加更多信息:
令牌似乎有效,这是 jwt.ms 的结果,我什至通过清单设置了“管理员”角色:
这是我的代码,我没有指定 public 签名(还不知道该怎么做),但我什至关闭了 IssueSignature 验证。
这是我的控制器的样子:
我的 fiddler 请求和响应(使用 http 端点而不是 https 进行本地开发会有所不同吗?)我不相信它会:
检查您的访问令牌并确保 aud
声明值等于 clientId
。通常 aud
声明类似于 api://clientId,这不是您在代码中设置的内容。如果是这种情况,请将其设置为 "api://" + clientId
您应该得到一个 401 错误,这意味着您令牌的 aud
不是您的 api。错误的原因一般是你在请求token的时候设置了错误的scope
。我使用了 client credential flow 为您制作演示:
您需要在 Azure 广告中创建两个应用程序,一个代表 客户端应用程序,另一个代表 api 应用程序,然后使用客户端应用程序调用 Web api 应用程序。
首先需要暴露代表web的应用apiapi,可以按照以下流程进行配置:
Azure 门户>应用注册>公开API>添加范围>添加客户端应用程序
接下来,您需要定义api个应用程序的清单,并为您的客户端应用程序授予应用程序权限(这是您自己定义的角色权限,您可以在我的APIs中找到它当你添加权限时)
是定义manifest的过程。
这是为客户端应用程序授予权限(您可以在我的APIs中找到您的公开api权限):
请求访问令牌:
解析token:
我有一个 .NET 4.7 Web API 项目(不是 .NET CORE)。
我正在尝试使用 Azure AD 目录设置身份验证,我在我的 AD 中设置了一个应用程序,并获得了客户端 ID(应用程序 ID)
我想使用 Client Credentials 授权类型。所以我继续通过访问令牌 URL https://login.microsoftonline.com/HIDDEN/oauth2/v2.0/token 检索令牌 我正在传递客户端 ID 和秘密,为此我使用 Postman
现在在我的项目中,我在我的 web api 项目中实现了以下逻辑:
var clientId = "AZURE APPLICATION ID";
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AllowedAudiences = new List<string> { clientId },
TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false,
ValidAudience = clientId
}
});
在我的控制器上,我应用了 [Authorize] 属性
当调用 API 控制器端点时(确保我正在传递值为“Bearer MYTOKEN”的授权 header),我收到 Postman 返回的错误:
“消息”:“此请求的授权已被拒绝。”
有什么方法可以让我更深入地找出问题所在?
我在 visual studio 中的输出 window 中没有看到任何内容,是否有一些事件我可以关联到失败的原因?
编辑:根据 Carl 添加更多信息:
令牌似乎有效,这是 jwt.ms 的结果,我什至通过清单设置了“管理员”角色:
这是我的代码,我没有指定 public 签名(还不知道该怎么做),但我什至关闭了 IssueSignature 验证。
这是我的控制器的样子:
我的 fiddler 请求和响应(使用 http 端点而不是 https 进行本地开发会有所不同吗?)我不相信它会:
检查您的访问令牌并确保 aud
声明值等于 clientId
。通常 aud
声明类似于 api://clientId,这不是您在代码中设置的内容。如果是这种情况,请将其设置为 "api://" + clientId
您应该得到一个 401 错误,这意味着您令牌的 aud
不是您的 api。错误的原因一般是你在请求token的时候设置了错误的scope
。我使用了 client credential flow 为您制作演示:
您需要在 Azure 广告中创建两个应用程序,一个代表 客户端应用程序,另一个代表 api 应用程序,然后使用客户端应用程序调用 Web api 应用程序。
首先需要暴露代表web的应用apiapi,可以按照以下流程进行配置:
Azure 门户>应用注册>公开API>添加范围>添加客户端应用程序
接下来,您需要定义api个应用程序的清单,并为您的客户端应用程序授予应用程序权限(这是您自己定义的角色权限,您可以在我的APIs中找到它当你添加权限时)
这是为客户端应用程序授予权限(您可以在我的APIs中找到您的公开api权限):
请求访问令牌:
解析token: