关于c#:Daemon应用程序和作用域

Daemon Apps and Scopes

因此,我正在尝试查看是否可以支持C#守护程序应用程序可以访问受MSAL.NET和OAuth2范围保护的自定义Web API的方案。到目前为止,我看不到这样做的方法。

库和工具集的版本为:

.NET Core 2.2
Microsoft.Identity.Client 4.1.0

客户是

1
2
3
4
var app = ConfidentialClientApplicationBuilder.Create("")
                .WithClientSecret("<client_secret>")
                .WithAuthority("https://login.microsoftonline.com/<tenant_id_that_hosts_the_web_api>")
                .Build();

然后获取令牌

1
await app.AcquireTokenForClient(new string[] {"api:///.default" });

这时,我确实获得了令牌,我将其称为使用MSAL和具有上述App ID的Azure App保护的自定义Web API端点。这不起作用,因为我在端点上具有基于策略的授权,希望在Azure AD应用程序中定义特定的自定义范围。

问题是,如何配置客户端和Azure AD,以便获得作为Web API声明传递的特定范围?


首先,感谢Caiyi提出的建议。这让我思考了正确的方法。不幸的是,我被迫使用api:///.default获取访问令牌。当使用"常规"作用域时,似乎没有任何动作在起作用。我按照上面的建议配置了应用程序,但不是:

1
await app.AcquireTokenForClient(new string[] {"api:///read" });

我必须使用:

1
await app.AcquireTokenForClient(new string[] {"api:///.default" });

在API应用程序的配置中,我必须在清单中定义一个" appRole",以标识要分配给Daemon应用程序的角色,然后在Web API中,更改策略代码以检查作用域或应用程序角色-起作用了。


您需要注册两个应用程序,一个用于守护程序应用程序(客户端应用程序),一个用于Web api(后端应用程序)。

enter

1
2
3
4
var app = ConfidentialClientApplicationBuilder.Create("<client app id>")
                .WithClientSecret("<client app client_secret>")
                .WithAuthority("https://login.microsoftonline.com/<tenant_id>")
                .Build();

范围:

1
await app.AcquireTokenForClient(new string[] {"api:///read" });

请参阅此示例。您可以将您的Web API视为Microsoft Graph API。