В диалоговом окне согласия администратора запрашиваются разные разрешения, а затем запрашиваются
Я разрабатываю веб-приложение asp.net core .net 5, размещенное на лазурном сервере, и хочу предоставить нашим клиентам возможность единого входа.
В качестве справки я взял пример из https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/2-WebApp-graph-user/2-3-Multi-Tenant, где администратор AAD предоставляет разрешения приложению для всех пользователей в AAD.
В примере используется URL-адрес согласия администратора, описанный здесь:https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-admin-consent#request-the-permissions-from-a- администратор каталога
В моем случае я просто хочу, чтобы пользователи входили в систему с учетной записью своей компании и читали свою электронную почту после входа в систему (никаких других данных профиля). Поэтому я подумал, что запроса областей "openid" и "email" будет достаточно. Но не имеет значения, какое значение области действия я предоставляю, диалоговое окно, представленное администратору, показывает другие запросы разрешений (выглядит как «профиль» и «offline_access» (?)):
Я создаю URL-адрес следующим образом:
var state = Guid.NewGuid().ToString();
var currentUri = UriHelper.BuildAbsolute(
httpContext.Request.Scheme,
httpContext.Request.Host,
httpContext.Request.PathBase);
var authorizationRequest = string.Format(
"https://login.microsoftonline.com/organizations/v2.0/adminconsent?client_id={0}&scope={1}&redirect_uri={2}&state={3}",
Uri.EscapeDataString(this.microsoftIdentityOptions.ClientId),
Uri.EscapeDataString("openid email"),
Uri.EscapeDataString(currentUri + "tenant/processcode"),
Uri.EscapeDataString(state));
Забавно то, что если администратор предоставляет доступ к приложению, и если я проверяю разрешения «корпоративного приложения» в AAD, я вижу именно те разрешения «электронная почта» и «openid», которые я изначально хотел:
Но это очень сбивает с толку администратора AAD, и я действительно хочу представить диалоговое окно, соответствующее моим запросам на разрешение.
2 ответа
Я объясню эти два момента:
- Это известная проблема. Когда вы используете конечную точку v2.0, даже если вы не добавляете область offline_access, она все равно будет отображаться на странице согласия администратора и в настоящее время не может быть удалена. Официальная документация , также объясняет это.
Это разрешение в настоящее время отображается на всех страницах согласия, даже для потоков, которые не предоставляют токен обновления (например, неявный поток). Эта настройка предназначена для сценариев, в которых клиент может начать в неявном потоке, а затем перейти к потоку кода, где ожидается токен обновления.
Если вы не хотите, чтобы область offline_access отображалась на начальной странице согласия администратора, вы можете использовать конечную точку v1.0. (Однако конечная точка 1.0 может запрашивать только статические разрешения)
https://login.microsoftonline.com/{tenant-id}/adminconsent?client_id={0}&scope={1}&redirect_uri={2}&state={3}
- Если приложение использует OpenID Connect для входа в систему, оно должно запрашивать область. Объем включает
profile
область действия по умолчанию, что предусмотрено дизайном! Объемopenid
объясняется на странице согласия администратора как: Позволяет пользователям входить в приложение со своими рабочими или учебными учетными записями и позволяет приложению видеть основную информацию профиля пользователя.
по умолчанию, как показано здесь , клиент запросит идентификатор openid и профиль:
Scope.Add("openid");
Scope.Add("profile");
Вот почему вы обычно видите вызов Clear(), чтобы очистить этот список областей по умолчанию, например:
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("email");
options.Scope.Add("myscope");