我有一个应用程序在前端使用React,在后端使用asp.net核心webapi。
为了保护前端,我正在使用adal.js并且它工作正常。我可以获得令牌和我需要的所有信息。
问题是我想将令牌传递给webapi,它应该允许或阻止请求。在过去,nuget Microsoft.Owin.Security.ActiveDirectory
效果很好,但现在似乎我应该使用Microsoft.AspNetCore.Authentication.JwtBearer
并且情况有所不同。
我在经典Azure门户中设置了客户端/ api应用程序,并且还授予访问api以验证客户端令牌的权限。
这是我的Startup.cs的样子:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Authority = ConfigurationManager.AppSettings["ida:AADInstance"] + ConfigurationManager.AppSettings["ida:TenantId"],
Audience = ConfigurationManager.AppSettings["ida:Audience"],
});
当我尝试使用[Authorize]属性访问webapi控制器(使用持有者令牌传递Authorization标头)时,我收到以下错误:
Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP / 1.1 POST http://localhost:44304/api/v1/Temp 0 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:信息:无法验证令牌eyJ0eXAiOiJK ...
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException:IDX10500:签名验证失败。没有提供安全密钥来验证签名。 在System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token,TokenValidationParameters validationParameters) 在System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token,TokenValidationParameters validationParameters,SecurityToken& validatedToken) 在Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.d__1.MoveNext()
我尝试了所有不同的设置,但似乎都没有。我发现的资源与Azure AD B2C或Azure AD v2端点有关,因为adal.js我仍在使用“经典”,我找不到任何可以帮助我的东西。
任何线索?提前谢谢。
PS:由于我还在开发,SSL证书无效。我不确定它是否与此错误有关。
更新
在实施@Saca答案后,我现在收到以下错误:
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:信息:用户授权失败:(null)。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:过滤器“Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter”上的请求授权失败。 Microsoft.AspNetCore.Mvc.ChallengeResult:信息:使用身份验证方案执行ChallengeResult()。 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:信息:AuthenticationScheme:Bearer受到挑战。
答案 0 :(得分:2)
经过一整个下午尝试这里的事情就是解决方案:
在我的Startup.cs中我在app.UseCors(CorsPolicy);
我只是切换,现在它工作正常。