我们有一个SPA,它使用MSAL获取访问令牌、id令牌和刷新令牌,并将令牌缓存在本地存储中供以后使用。在此之后,我们有一个运行dotnet 6的Web,我在启动Program.cs中配置了身份验证,如下所示:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));然后我有一个appsettings.json文件,其中包含AzureAD配置部分。
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "example.com",
"TenantId": "guid",
"ClientId": "guid",
"Scopes": "access_as_user"
}这看起来挺好的。[Authorize]属性通过要求令牌来保护控制器。我的问题是,如果没有客户端的秘密,我如何能够信任来自SPA的访问令牌?在验证令牌的AddMicrosoftIdentityWebApi方法中是否存在一些魔术?
我快速查看了消息来源,但什么也没找到。
发布于 2022-12-02 17:58:31
免责声明:不是这个主题的专家,根据我自己使用https://www.youtube.com/watch?v=pJwtUjv3G_o的经验回答。这可能不适用于您获得实际访问令牌客户端的用例。
当您使用Microsoft.Identity.Web配置后端时,需要接触到Microsoft平台(Azure ),以便能够对用户或应用本身进行身份验证。这是使用客户端机密或客户端证书完成的。但这里的棘手之处在于这是什么时候发生的,以及它是否自动发生。
这是我使用团队令牌的经验:
AuthenticationMiddleware将使您的请求立即失败,因此,当不提供客户端机密/证书时,肯定有一定的保护级别,但我无法自信地告诉您到底是哪一点。
然而:
ITokenAcquisition.GetAuthenticationResultForUserAsync()来代表用户进行身份验证,您将得到如下异常:MSAL.NetCore.4.44.0.0.MsalClientException:
ErrorCode: Client_Credentials_Required_In_Confidential_Client_Application
Microsoft.Identity.Client.MsalClientException: One client credential type required either: ClientSecret, Certificate, ClientAssertion or AppTokenProvider must be defined when creating a Confidential Client.Only specify one.See https://aka.ms/msal-net-client-credentials.ITokenAcquisition.GetAuthenticationResultForAppAsync()进行身份验证也是一样的。再一次,我的用例似乎与您的略有不同,因为我只得到一个无用的独立团队id令牌客户端,因此需要用户身份验证服务器端,而Teams token <-> Actually useful tokens交换正是在Microsoft.Identity.Web的帮助下发生的。
https://stackoverflow.com/questions/74658061
复制相似问题