oauth2.0 MSALAngular ,净

tvz2xvvm  于 2023-10-15  发布在  Angular
关注(0)|答案(1)|浏览(129)

应用程序-
1..Net 6 Web API

  1. Angular前端
  2. SQL DB
    1..Net 6 Windows服务
    我需要实现以下-授权代码流,其中angular app获取auth代码并将其发送到.net 6 web API,后者在内部通过auth代码获取访问令牌。然后.net 6 windows服务在内部使用该令牌来调用graph API,如果令牌过期,则在没有用户交互的情况下刷新令牌。
    应用程序用户-用户可以是多租户
    通过我目前的研究,微软文档展示了如何使用Web应用程序或Angular完成认证代码流,我不希望在前端完成此操作,我对如何实现上述场景感到困惑,如果有人能指导我一条路径将对我有很大帮助,谢谢。
k4emjkb1

k4emjkb11#

在我看来,Angular客户端app + .net核心web API,这种场景,我们应该把认证和授权部分放到angular项目中,这样用户就可以登录并生成访问令牌来调用API。
在API内部,如果我们需要调用MS graph API,我们可以使用代表流来生成访问令牌。在API项目中使用代表流,我们只需要添加认证方案并注入图SDK或令牌获取服务。这个流程,也许你可以看看这个代码片段。

StringValues authorizationToken;
HttpContext.Request.Headers.TryGetValue("Authorization", out authorizationToken);
var token = authorizationToken.ToString().Replace("Bearer ","");
var scopes = new[] { "User.Read.All" };
var tenantId = "xxxx";
var clientId = "xxxx";
var clientSecret = "xxxx";
var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, token);
var tokenRequestContext = new TokenRequestContext(scopes);
var token2 = onBehalfOfCredential.GetTokenAsync(tokenRequestContext, new CancellationToken()).Result.Token;
var graphClient = new GraphServiceClient(onBehalfOfCredential, scopes);
var user = await graphClient.Users.GetAsync();

顺便说一下,当我们使用授权代码流登录时,如果我们没有在Azure AD API权限刀片中给予给予管理员同意,则在输入密码和用户名后,它应该要求我们给予给予同意,对于客户端凭据流,需要给予给予管理员同意。如果我们在多租户场景中使用客户端凭证流,恐怕我们应该提前通过管理员同意步骤。

https://login.microsoftonline.com/common/adminconsent?client_id=xxxe&state=12345&redirect_uri=http://localhost/myapp/permissions

客户端凭证流程代码示例,这是基于Microsoft.Graph v4.x包的,使用v5.x应该有一些区别:

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenant_name.onmicrosoft.com";//common for multi-tenant
var clientId = "aad_app_id";
var clientSecret = "client_secret";
var clientSecretCredential = new ClientSecretCredential(
                tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
var res = await graphClient.Users["{user-id}"].Messages["{message-id}"].Request().GetAsync();

相关问题