.NET Framework 4.8 MVC中AuthorizeForScopes找不到的原因与解决
我正尝试遵循微软官方教程,为基于.NET Framework 4.8的ASP.NET MVC Web应用获取访问令牌。
我的控制器代码如下:
[Authorize] public class HomeController : Controller { [AuthorizeForScopes(Scopes = new[] { "user.read" })] public async Task<IActionResult> Profile() { // 获取授权头 IAuthorizationHeaderProvider authorizationHeaderProvider = this.GetAuthorizationHeaderProvider(); string[] scopes = new string[]{"user.read"}; string authorizationHeader = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(scopes); // 使用访问令牌调用受保护的Web API HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", authorizationHeader); string json = await client.GetStringAsync(url); } }
但遇到了如下错误:
The type or namespace name 'AuthorizeForScopes' could not be found (are you missing a using directive or an assembly reference?)
错误原因
AuthorizeForScopes是Microsoft.Identity.Web库中的特性,该库专为ASP.NET Core设计,并不适配.NET Framework的ASP.NET MVC框架。你参考的教程针对ASP.NET Core场景,直接移植到.NET Framework MVC中会出现类型找不到的问题。- .NET Framework的ASP.NET MVC项目默认不包含Microsoft.Identity.Web的引用,也没有对应的命名空间支持。
解决方案
替换特性逻辑
放弃使用AuthorizeForScopes,改用.NET Framework适配的令牌获取方案,推荐使用**MSAL(Microsoft.Identity.Client)**库来手动处理令牌获取和权限范围验证。安装必要的NuGet包
在NuGet包管理器中安装Microsoft.Identity.Client,这是微软针对.NET平台推荐的身份验证库。调整控制器代码
以下是使用MSAL获取令牌的示例代码:using Microsoft.Identity.Client; using System.Linq; [Authorize] public class HomeController : Controller { public async Task<ActionResult> Profile() { // 替换为你的Azure AD应用参数 var clientId = "你的应用客户端ID"; var tenantId = "你的租户ID"; var authority = $"https://login.microsoftonline.com/{tenantId}"; // 初始化MSAL客户端 var pca = PublicClientApplicationBuilder.Create(clientId) .WithAuthority(authority) .Build(); // 获取当前登录用户的账户信息 var accounts = await pca.GetAccountsAsync(); var userAccount = accounts.FirstOrDefault(); // 静默获取访问令牌(若缓存中无有效令牌,会触发交互式登录) var scopes = new[] { "user.read" }; var authResult = await pca.AcquireTokenSilent(scopes, userAccount) .ExecuteAsync(); // 调用受保护API using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken); var json = await client.GetStringAsync("https://graph.microsoft.com/v1.0/me"); // 后续处理返回的JSON数据 } return View(); } }补充配置
在Web.config中添加Azure AD相关配置项,示例:<appSettings> <add key="ida:ClientId" value="你的应用客户端ID" /> <add key="ida:TenantId" value="你的租户ID" /> </appSettings>
内容的提问来源于stack exchange,提问作者Ibrahim Memet
相关产品推荐
相关产品推荐

