Используя стандартный мастер Visual Studio 2017 (последняя версия), я создал приложение ASP.NET Core MVC 2.0 с отдельными учетными записями и включил поставщика Microsoft в Startup / ConfigureServices:
services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = "client";
microsoftOptions.ClientSecret = "secret";
});
Это работает,Я могу войти в систему.
Теперь я могу добавить несколько областей действия, например:
microsoftOptions.Scope.Add("Mail.ReadWrite");
microsoftOptions.Scope.Add("Mail.Send");
, и все еще могу войти в систему.
Теперь я добавлю еще одну область действия
microsoftOptions.Scope.Add("wl.imap");
Мне это нужно для доступа к учетной записи пользователя через IMAP.Это приводит к ошибке 500, когда я перенаправлен обратно на https://localhost:44356/signin-microsoft?code=Mc2b68f4d-470d-feea-f844-2affc5a6c6a4&state=xxx
Exception: OAuth token endpoint failure: Status: BadRequest;Headers: Cache-Control: no-cache, no-store
Pragma: no-cache
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
x-ms-request-id: 57913256-87df-4564-892e-7d26c6502200
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
Set-Cookie: fpc=AgXVFto7n3VFttLDS7F2OQzrCidiAgAAAC96g9QOAAAA; expires=Sun, 30-Jun-2019 19:40:33 GMT; path=/; secure; HttpOnly, x-ms-gateway-slice=prod; path=/; secure; HttpOnly, stsservicecookie=ests; path=/; secure; HttpOnly
Date: Fri, 31 May 2019 19:40:32 GMT
;Body: {"error":"invalid_scope","error_description":"AADSTS70011: The provided request must include a 'scope' input parameter.\r\nTrace ID: 57913256-87df-4564-892e-7d26c6502200\r\nCorrelation ID: 6c9a489c-7e5f-493b-816b-45772fa45209\r\nTimestamp: 2019-05-31 19:40:33Z","error_codes":[70011],"timestamp":"2019-05-31 19:40:33Z","trace_id":"57913256-87df-4564-892e-7d26c6502200","correlation_id":"6c9a489c-7e5f-493b-816b-45772fa45209"};
Я также пробовал несколько других областей wl. *, А также office.onenote_create с https://msdn.microsoft.com/en-us/windows/desktop/hh243646 - эффектто же самое - не повезло.
microsoftOptions.Scope.Add("wl.emails");
Я успешно использую эти области с аналогичным приложением ASP.NET Framework MVC5 (которое использует тот же client_id).Проблема относится только к версии .NET Core.
Запрос выполняется только в том случае, если я не добавляю области wl. *.
Когда я сравниваю версию .NET Core и .NET Framework (запросы на https://login.live.com/oauth20_authorize.srf в Fiddler), я вижу эту разницу:
.NET Core: GET /oauth20_authorize.srf?client_id=xxx&scope=https%3a%2f%2fgraph.microsoft.com%2fuser.read & redirect_uri = https% 3a% 2f% 2flocalhost% 3a44356% 2fsignin-microsoft & response_type = code & state = xxx
.NET Framework: GET /oauth20_authorize.srf?client_id=xxx&scope=wl.imap%20wl.email.offline_access & response_type = code & redirect_uri = http% 3A% 2F% 2Flocalhost% 3A7676% 2Fsignin-microsoft & state = xxx
.NET Основной запрос выше - это тот, который выполняется успешно, без добавления областей wl. *.Однако у него уже есть несколько областей применения, которые я не запрашивал.В то же время, в случае версии .NET Framework список областей не имеет никаких областей, кроме тех, которые я установил сам (wl. *).Таким образом, в случае ASP.NET Core его промежуточное программное обеспечение добавляет несколько областей действия (например, https://graph.microsoft.com).
Похоже, что поставщик Microsoft не может поддерживать одновременный запрос областей https://graph.microsoft.com и wl. *?
Я пытался добавить
microsoftOptions.Scope.Clear();
Но это делает процесс аутентификации неудачным, поскольку промежуточному программному обеспечению требуется область https://graph.microsoft.com для заполнения профиля пользователя. Интересно, что более старая версия .NET Framework могла получитьпрофиль без запроса какой-либо конкретной области.
Есть идеи, как можно запросить области wl. * в приложении ASP.NET Core 2.0?
РЕДАКТИРОВАТЬ 1:
Я также пыталсядобавление https://graph.microsoft.com/user.read к запрошенным областям в устаревшем приложении ASP.NET Framework (которое запрашивает wl.imap и другие области wl. *). Это работает там! Так что, похоже, сам сервер Microsoft не имеет проблем с этим,это что-то в приложении ASP.NET Core, которое не может с этим справиться. Но что именно ..
РЕДАКТИРОВАТЬ 2: Нет, оказывается, версии .NET Framework и .NET Core следуют по разным путям после https://login.live.com/oauth20_authorize.srf запрос.Версия .NET Framework - https://login.live.com/oauth20_token.srf (что работает), а версия .NET Core - https://login.microsoftonline.com/common/oauth2/v2.0/token (которая фактически возвращает error_description = AADSTS70011: предоставленный запрос должен включать входной параметр scope).,Затем приложение .NET Core возвращает ошибку 500.Тем не менее, я не знаю, как преодолеть это.
РЕДАКТИРОВАТЬ 3:
ОК, добавив
microsoftOptions.TokenEndpoint = "https://login.live.com/oauth20_token.srf"
сделали свое дело.Теперь я могу использовать специфичные для IMAP области, как в более старой версии .NET Framework приложения.