密码更改后, AzureChainedTokenCredential无法进行本地开发。我已经使用了ChainedTokenCredential几周来ManagedIdentityCredential在 Azure 中进行身份验证以及DefaultAzureCredential对我的函数应用程序进行本地测试。一切都按计划进行。下面是一个代码示例,该代码示例在 Azure 中一直有效,但在本地却无效。
def get_client():
MSI_credential = ManagedIdentityCredential()
default_credential = DefaultAzureCredential()
credential_chain = ChainedTokenCredential(MSI_credential, default_credential)
storageurl = os.environ["STORAGE_ACCOUNT"]
client = BlobServiceClient(storageurl, credential=credential_chain)
return client
Run Code Online (Sandbox Code Playgroud)
上周我不得不更改密码,从那时起我收到以下错误。
[2021-04-19T15:18:06.931Z] SharedTokenCacheCredential.get_token failed: Azure Active Directory error '(invalid_grant) AADSTS50173: The provided grant has expired due to it being revoked, a fresh auth token is needed. The user might have changed or reset their password. The grant was issued on '2021-02-08T20:05:01.4240000Z' and the TokensValidFrom date …Run Code Online (Sandbox Code Playgroud) 任何人都可以解释为什么我们会收到诸如“无法加载文件或程序集”之类的错误。每当我专门在 azure sdk 中更新 nuget 引用时,我都会遇到此错误,并且由于缺乏知识,我很难非常奇怪地修复它们。您能解释一下这个错误吗?我的意思是我可以消化这个错误,但我找不到真正的解决方案。
我已经明确决定我将理解这个错误并在这个平台上获得更多信息。如果你能一步一步地解释这一点,那将增加我对核心生产力的了解。
我对此类错误的了解非常有限,我们需要在 web.config 文件中添加一些代码。
<bindingRedirect oldVersion="0.0.0.0-0.0.0.1" newVersion="0.0.0.1" />
Run Code Online (Sandbox Code Playgroud)
但说实话,我不知道如何决定需要用新旧版本替换哪个版本。我最近将 Azure.Identity nuget 添加到我的项目中。
<ItemGroup>
<PackageReference Include="Azure.Identity" Version="1.5.0" />
<PackageReference Include="Azure.Storage.Blobs" Version="12.10.0" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
例如,现在我一直在努力解决这个错误。
System.IO.FileLoadException
HResult=0x80131040
Message=Could not load file or assembly 'Azure.Core, Version=1.19.0.0, Culture=neutral,
PublicKeyToken=92742159e12e44c8' or one of its dependencies. The located assembly's
manifest definition does not match the assembly reference. (Exception from HRESULT:
0x80131040)
Source=Azure.Storage.Blobs
StackTrace:
Run Code Online (Sandbox Code Playgroud)
我知道要更改哪里来解决此错误,但不知道要更改什么。
我还没有找到有关Azure.Identity库是否缓存令牌的任何详细信息。我想知道它是否正确地缓存了每个范围的令牌并在到期之前更新它,否则我必须自己编写此功能。
也欢迎任何指向正确文档的指示。
SharedTokenCacheCredential图书馆里有一本,但我相信那是别的东西。出于性能原因,我询问内存中缓存 - 不要每次都获取新令牌。
.net authentication azure azure-active-directory azure-identity
我正在构建一个 SPA 可以调用 API 的系统。SPA 以及 API 在 Azure AD 中使用需要将用户分配给它的应用程序注册来表示。
在分配过程中,用户还会被分配给应用程序注册公开的角色。可用的角色是SPA 和 API 应用程序注册中的和Developer,我在这两个注册中为用户分配相同的角色。User
API 注册还公开 SPA 注册用于请求访问令牌的范围。
SPA 中的角色用于呈现不同的 UI 元素,具体取决于用户是否被分配Developer或User。
一旦用户批准了 SPA 向 API 请求的范围,就可以调用 API。此访问令牌的声明aud是 API 的应用程序注册的 ID,它还包含Developer在加入步骤中分配的角色。
我有几个与此相关的问题,仅通过阅读文档很难弄清楚。
管理调用链中的角色(SPA -> API)
通过系统传播角色的正确方法是什么?所有应用程序注册是否需要具有相同的角色,并且用户在每个注册中手动分配角色?
或者我可以传播用户首次登录 SPA 时收到的角色吗?或者这是否会破坏 JWT 的安全性?我猜想这需要在每个应用程序注册中处理,因为没有什么可以阻止我修改传出请求并将角色设置为Admin。
角色和范围
我发现这个答案部分地向我解释了这些概念。User.Read我正在构建一个内部系统,除了 OIDC提供的(电子邮件、oid 等)之外,实际上并不需要任何其他用户数据。SPA 请求此范围来显示登录的用户名。
除了用户提供的信息之外,我的 API 永远不会需要任何其他信息。在这种情况下我还需要示波器吗?
同意仅适用于范围吗?
是否knownClientApplications且preAuthorizedApplications仅在使用范围时适用?
如果这是胡言乱语,我深表歉意,我已经阅读了太多文档,以至于我无法保持头脑清醒。
我正在使用 azure 托管身份,下面的代码生成所需的令牌来验证 api。我在用<PackageReference Include="Azure.Identity" Version="1.4.0" />
var credential = new ManagedIdentityCredential();
var accessToken = await credential.GetTokenAsync(new Azure.Core.TokenRequestContext(new[] {"my_scope"}));
return accessToken.Token;
Run Code Online (Sandbox Code Playgroud)
现在,在每个 api 调用中,我都调用上面的方法来获取令牌。问题是有什么方法可以缓存这个令牌并自动刷新?这是内置可用的东西吗?