asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误
Posted
技术标签:
【中文标题】asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误【英文标题】:AzureAD and AzureADBearer in asp.net core app, gives invalid signature error 【发布时间】:2019-10-21 06:22:17 【问题描述】:我在 asp.net core 2 应用程序中使用 AzureAD。我想同时使用 cookie 和承载身份验证。我在启动文件中有以下代码:
public void ConfigureServices(IServiceCollection services)
services.Configure<CookiePolicyOptions>(options =>
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
//options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
);
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAdClient", options));
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), sqlServerOptions => sqlServerOptions.CommandTimeout(120)));
//services.AddMvc();
services.AddMvc(options =>
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
//options.Filters.Add(new AuthorizeFilter(policy));
)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
我已将授权属性添加为:
[Authorize(AuthenticationSchemes = "AzureADBearer")]
现在,当我从邮递员那里打到时,我可以获得不记名令牌,但是当我使用该令牌访问此 API 时,我收到签名无效错误:
WWW-Authenticate →Bearer error="invalid_token", error_description="签名无效"
有什么想法吗?
【问题讨论】:
授权属性不应该是Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
这里有一个示例供您参考。 github.com/Azure-Samples/…
你的AzureAdClient
配置是什么?验证令牌的配置是否正确?
@NanYu,此配置适用于在 Azure AD 上注册的新客户端应用程序。我已将此新应用程序添加为 API 应用程序中的客户端。所以我在 Azure AD 上有两个应用程序,一个用于 WebAPI,一个用于客户端。
【参考方案1】:
试试下面的方法,应该可以的。
services.AddAuthentication(sharedOptions =>
sharedOptions.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
sharedOptions.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
)
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
在控制器应用程序中,您可以像这样设置架构:
[HttpGet]
[Authorize(AuthenticationSchemes = "AzureADBearer")]
public IEnumerable<string> Get()
return new string[] "value1", "value2" ;
希望对你有帮助。
【讨论】:
我在发布这个问题之前尝试过这个。我没有工作。同样的问题。【参考方案2】:好吧,我解决了这个问题。现在在 asp.net core web + API 项目中,我只使用 API 特定的 AzureAD 设置。对于 Postman 和移动应用程序,我创建了一个新的应用程序注册,并为早期应用程序注册(API 应用程序注册)添加了范围,这些应用程序具有用户模拟和作为用户权限的访问权限。
【讨论】:
以上是关于asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误的主要内容,如果未能解决你的问题,请参考以下文章
Azure AD 与 ASP.NET Core MVC 中的标识
使用 JWT 令牌保护 asp.net 核心 Web api 时如何从 Azure AD 获取用户
如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api