C# 中的 MSAL(Microsoft 身份验证库)是否有一种方法可以以交互方式为管理员获取访问令牌,然后以静默方式为其他用户获取访问令牌?

问题描述 投票:0回答:1

我正在尝试将 oauth2 实现到电子邮件应用程序中。我希望一个具有特殊权限的用户能够以交互方式获取授权,然后租户/组织/网络中的其他用户可以默默地获取令牌。我希望普通用户不必进行交互式获取。

通常的流程是:

var accounts = await publicClientApplication.GetAccountsAsync();

  AuthenticationResult authtoken;
  try
  {
    authtoken = await publicClientApplication.AcquireTokenSilent(scopes,  accounts.FirstOrDefault()).ExecuteAsync();
  }
  catch (MsalUiRequiredException)
  {
    authtoken = await publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync();
  }

检查您是否可以静默获取令牌,如果不能则以交互方式获取。如所示:https://learn.microsoft.com/en-us/entra/msal/dotnet/acquiring-tokens/acquiretokensilentasync-api

有没有一种方法可以使提供给组织的应用程序能够让管理员进行交互式获取,而租户中的其他用户则不需要这样做?我认为这就是 GetAccountsAsync() 方法应该如何工作的,但我根本无法让它返回任何帐户。

c# asp.net .net oauth-2.0 azure-ad-msal
1个回答
0
投票

由于它被标记为 Asp.Net,我将假设您从 asp net 控制器调用它。如果没有,您将必须获取当前拥有的上下文或用户。

如果您想根据用户身份执行某些操作,我建议使用角色声明。您必须为想要跳过交互的用户提供特定角色,并在声明中查询该角色。

给定 Asp.Net 控制器中的 HttpContext。您可以通过这种方式访问用户角色:

var roles = HttpContext.User.Identities.First().Claims.Where(x => x.Type == ClaimsIdentity.DefaultRoleClaimType);

if(roles.Contains("MY ROLE TO EXCLUDE"))
{
//your special implementation here.
}

这将允许您为某些类型的用户动态调用特定代码。

© www.soinside.com 2019 - 2024. All rights reserved.