Моя надстройка SharePoint запускает этот JavaScript, чтобы получить сообщение от моего Greeting API:
async function getGreeting() {
// https://www.youtube.com/watch?v=P3vkerr1nW8
var client = new Msal.UserAgentApplication(config);
var request = {
scopes: ['user.read'],
prompt: 'select_account'
};
let loginResponse = await client.loginPopup(request);
let tokenResponse = await client.acquireTokenSilent(request);
var theToken = tokenResponse.accessToken;
// https://zinoui.com/blog/jquery-ajax-headers
$.ajax({
url: 'https://localhost:44316/Greeting',
type: 'GET',
headers: {
'Authorization': 'Bearer ' + theToken
},
timeout: 600000,
success: function (theGreeting) { alert(theGreeting); },
error: function () { alert('Error'); }
});
}
У моего контроллера ASP.NET Core 3.1 есть этот код:
namespace SharePointTestAPI.Controllers
{
// https://www.yogihosting.com/aspnet-core-enable-cors/
[Authorize]
[EnableCors("SharePointOnline")]
[ApiController]
[Route("[controller]")]
public class GreetingController : ControllerBase
{
[HttpGet]
public String Get()
{
return "Great Value Canned Salmon is Rich in Omega-3 and Vitamin D!!!";
}
}
}
Если я закомментирую атрибут [Авторизовать], появится окно с предупреждением, в котором будет показано ожидаемое сообщение о Walmart Salmon. К сожалению, если я верну атрибут [Authorize], я увижу эту ошибку в заголовке ответа:
WWW-Authenticate: Bearer error = invalid_token, error_description = Подпись недействительна
Токены, которые я получаю от acquTokenSilent, хорошо смотрятся как на клиенте, так и на сервере. В обоих случаях они отлично декодируют на https://jwt.ms/, поэтому я не знаю, почему MicrosoftIdentityWebApiAuthentication похоже, жалуется, что токены недействительны.
Моя функция ConfigureServices в Startup.cs выглядит так:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
// https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0
// https://www.yogihosting.com/aspnet-core-enable-cors/
options.AddPolicy(
"SharePointOnline",
builder =>
{
builder.WithOrigins(
"https://myTestTenant-3b3547c0f805ae.sharepoint.com"
).AllowAnyHeader().AllowAnyMethod();
}
);
}
);
services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");
services.AddControllers();
}
Вот мой очищенный appsettings.json:
{
/*
The following identity settings need to be configured
before the project can be successfully executed.
For more info see https://aka.ms/dotnet-template-ms-identity-platform
*/
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "myTenantName.onmicrosoft.com",
"TenantId": "[someGUID]",
"ClientId": "api://[someOtherGUID]",
"CallbackPath": "/signin-oidc"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Может ли кто-нибудь помочь мне понять, почему MicrosoftIdentityWebApiAuthentication, похоже, думает, что мой токен аутентификации поврежден?