Asp.net web api 使用Azure AD保护.NET Framework Web API(客户端凭据流)

Asp.net web api 使用Azure AD保护.NET Framework Web API(客户端凭据流),asp.net-web-api,asp.net-web-api2,azure-ad-b2c,Asp.net Web Api,Asp.net Web Api2,Azure Ad B2c,我有一个.NET4.7WebAPI项目(不是.NETCore) 我正在尝试使用Azure AD目录设置身份验证,我在我的AD中设置了一个应用程序,并获得了客户端id(应用程序id) 我想使用客户端凭据授权类型。因此,我继续前进,并通过访问令牌URL检索令牌,我正在传递客户端id和secret,为此,我使用了Postman 现在,在我的项目中,我在我的web api项目中实现了以下逻辑: var clientId = "AZURE APPLICATION ID"; app.Us

我有一个.NET4.7WebAPI项目(不是.NETCore)

我正在尝试使用Azure AD目录设置身份验证,我在我的AD中设置了一个应用程序,并获得了客户端id(应用程序id)

我想使用客户端凭据授权类型。因此,我继续前进,并通过访问令牌URL检索令牌,我正在传递客户端id和secret,为此,我使用了Postman

现在,在我的项目中,我在我的web api项目中实现了以下逻辑:

var clientId = "AZURE APPLICATION ID";
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
    
    AllowedAudiences = new List<string> { clientId },
    TokenValidationParameters = new TokenValidationParameters
    {

        ValidateAudience = false,
        ValidAudience = clientId
    }
});
var clientId=“AZURE应用程序ID”;
app.useJWTBeareAuthentication(新的JWTBeareAuthenticationOptions
{
AllowedAudients=新列表{clientId},
TokenValidationParameters=新的TokenValidationParameters
{
ValidateAudience=false,
有效期=客户ID
}
});
在我的控制器上,我应用了[Authorize]属性

调用API控制器终结点时(确保传入了带有值“Bearer MYTOKEN”的授权标头),我在Postman中得到了返回的错误:

“消息”:“此请求的授权已被拒绝。”

有没有一种方法可以让我更深入地了解问题所在

我在VisualStudio的输出窗口中看不到任何内容,是否有一些事件可以关联到它失败的原因

编辑:根据Carl添加更多信息:

令牌似乎是有效的,以下是jwt.ms的结果,我甚至通过清单设置了一个“admin”角色:

这是我的代码,我没有指定公共签名(还不知道如何做),但我甚至关闭了issueSignatureValidation。

这就是我的控制器的外观:

我的fiddler请求和响应(在本地开发中使用http端点而不是https会有所不同吗?)

检查您的访问令牌,并确保
aud
声明值等于
clientId
。通常,
aud
索赔类似api://clientId 这不是您在代码中设置的。如果是这种情况,请将其设置为
“api://”+clientId
检查您的访问令牌,并确保
aud
声明值等于
clientId
。通常,
aud
索赔类似api://clientId 这不是您在代码中设置的。如果是这种情况,请将其设置为
“api://”+clientId

您应该会得到一个401错误,这意味着您的令牌的
aud
不是您的api。错误的原因通常是在请求令牌时设置了错误的
范围。我使用了“为您制作演示”:

您需要在Azure ad中创建两个应用程序,一个代表客户端应用程序,另一个代表api应用程序,然后使用客户端应用程序调用Web api应用程序

首先,您需要公开表示web api的应用程序的api,您可以按照以下流程进行配置:

Azure门户应用程序注册公开API添加范围添加客户端应用程序

接下来,您需要定义api应用程序的清单并向客户端应用程序授予应用程序权限(这是您自己定义的角色权限,您可以在添加权限时在My api中找到它)

是定义清单的过程

这是为了授予客户端应用程序的权限(您可以在我的api中找到您的公开api权限):

请求访问令牌:

解析令牌:


您应该得到一个401错误,这意味着您的令牌的
aud
不是您的api。错误的原因通常是在请求令牌时设置了错误的
范围。我使用了“为您制作演示”:

您需要在Azure ad中创建两个应用程序,一个代表客户端应用程序,另一个代表api应用程序,然后使用客户端应用程序调用Web api应用程序

首先,您需要公开表示web api的应用程序的api,您可以按照以下流程进行配置:

Azure门户应用程序注册公开API添加范围添加客户端应用程序

接下来,您需要定义api应用程序的清单并向客户端应用程序授予应用程序权限(这是您自己定义的角色权限,您可以在添加权限时在My api中找到它)

是定义清单的过程

这是为了授予客户端应用程序的权限(您可以在我的api中找到您的公开api权限):

请求访问令牌:

解析令牌:


您是否公开了受Azure保护的api?你能用它来解析你的访问令牌并提供截图吗?@CarlZhao——我已经提供了更多信息,谢谢@CarlZhao——我发现,尽管我将ValidateSuersigningKey设置为false,但似乎仍然需要通过“IssuerSigningKey”属性分配有效密钥。但感谢您对整个过程的解释,这非常有帮助,包括Azure AD中的清单编辑。您是否公开了受Azure保护的api?你能用它来解析你的访问令牌并提供截图吗?@CarlZhao——我已经提供了更多信息,谢谢@CarlZhao——我发现,尽管我将ValidateSuersigningKey设置为false,但似乎仍然需要通过“IssuerSigningKey”属性分配有效密钥。但是谢谢你对整个过程的解释这是v