Asp.net web api 使用Azure AD保护.NET Framework Web API(客户端凭据流)
我有一个.NET4.7WebAPI项目(不是.NETCore) 我正在尝试使用Azure AD目录设置身份验证,我在我的AD中设置了一个应用程序,并获得了客户端id(应用程序id) 我想使用客户端凭据授权类型。因此,我继续前进,并通过访问令牌URL检索令牌,我正在传递客户端id和secret,为此,我使用了Postman 现在,在我的项目中,我在我的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
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