Получать электронные письма от имени потока пользователей из Hotmail, используя Microsoft Identity Platform и MSAL.NET - PullRequest
0 голосов
/ 18 апреля 2020

Все, что я хочу, - это возможность получать электронные письма из Hotmail, я думал, что это будет очень легко.

Я был исследован о том, как получать электронные письма из Hotmail через OAuth, и теперь я зашел в тупик .

Вот моя предпочтительная архитектура:

Architecture

Что я знаю сейчас:

  1. I мне нужно использовать Microsoft Graph для получения электронных писем пользователя
  2. Мне нужно использовать поток OBO (от имени) в моем проекте WebApi для запроса токена доступа и выполнения операций

Там будет 2 проекты:

1 WebApi для обработки писем, полученных из Hotmail, Gmail et c. 1 WebApp SPA (React. js) для веб-интерфейса

Я в основном просмотрел все соответствующие документы Microsoft (например, Microsoft Identity Platform, MSAL. NET) и нашел эти 2 демонстрационных проекта, которые, по моему мнению, связаны между собой. в мой проект:

  1. WebApp вызывает WebApi для получения информации о пользователе. WebApi вызывает Microsoft Graph для получения электронных писем из веб-приложения Hotmail
  2. SPA (JavaScript) для вызова Microsoft Graph

На SPA, когда я запустил его демонстрационный проект (я заменил идентификатор приложения в конфигурациях), я обнаружил, что демонстрационный проект работает только в Edge (работают только пользовательские части входа), он даже не работает в Firefox.

Not work in FF

Я искал сообщение об ошибке, но не получилось.

У меня закончились идеи, как заставить работать мое решение.


Обновление 1:

Я пытался использовать эту реакцию + Asp . Net Базовый проект в качестве примеров. У меня есть и asp. net webapi runnint, и Reactjs запуск внешнего интерфейса: Но приложение reactjs всегда показывает это: enter image description here

Вот URL в адресная строка для приложения Reactjs:

https://login.microsoftonline.com/02xxxxxxx/oauth2/authorize?response_type=id_token&client_id=02xxxx&redirect_uri=https%3A%2F%2Flocalhost%3A3000&state=3b3e49f5-3fff-4249-b3ee-e4f28a87b3dd&client-request-id=2063333f-7dab-4afe-9922-4fe2909ccf37&x-client-SKU=Js&x-client-Ver=1.0.17&nonce=51c7f91f-1c87-4d4b-808b-082433370b39

Вот манифесты для My Asp. Net Базовый WebApi (Papayee) и Reactjs клиент (PapayeeClient)

Papayee:

{
    "id": "22xxxx",
    "acceptMappedClaims": null,
    "accessTokenAcceptedVersion": 2,
    "addIns": [],
    "allowPublicClient": false,
    "appId": "28xxx12",
    "appRoles": [],
    "oauth2AllowUrlPathMatching": true,
    "createdDateTime": "2020-04-03T03:59:12Z",
    "groupMembershipClaims": null,
    "identifierUris": [
        "https://papayee008.onmicrosoft.com/papayee008"
    ],
    "informationalUrls": {
        "termsOfService": null,
        "support": null,
        "privacy": null,
        "marketing": null
    },
    "keyCredentials": [],
    "knownClientApplications": [],
    "logoUrl": null,
    "logoutUrl": "https://localhost:44321/signout-oidc",
    "name": "Papayee",
    "oauth2AllowIdTokenImplicitFlow": true,
    "oauth2AllowImplicitFlow": true,
    "oauth2Permissions": [
        {
            "adminConsentDescription": "Allow Papayee to access user's emails for filtering billing emails",
            "adminConsentDisplayName": "Papayee User Impersonation",
            "id": "20xxx7a",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "type": "User",
            "userConsentDescription": "Allow Papayee to access user's emails for filtering billing emails",
            "userConsentDisplayName": "Papayee",
            "value": "user_impersonation"
        },
        {
            "adminConsentDescription": "This is used to retrieve your emails and find your bills",
            "adminConsentDisplayName": "Access Papayee as a user",
            "id": "98xxx15a",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "type": "User",
            "userConsentDescription": "This is used to retrieve your emails and find your bills",
            "userConsentDisplayName": "Access Papayee as a user",
            "value": "access_as_user"
        }
    ],
    "oauth2RequirePostResponse": false,
    "optionalClaims": {
        "idToken": [],
        "accessToken": [],
        "saml2Token": []
    },
    "orgRestrictions": [],
    "parentalControlSettings": {
        "countriesBlockedForMinors": [],
        "legalAgeGroupRule": "Allow"
    },
    "passwordCredentials": [
        {
            "customKeyIdentifier": null,
            "endDate": "2021-04-03T06:44:48.449Z",
            "keyId": "c0xxx110",
            "startDate": "2020-04-03T06:45:01.778Z",
            "value": null,
            "createdOn": "2020-04-03T06:45:10.0053885Z",
            "hint": "7uu",
            "displayName": "papayee"
        }
    ],
    "preAuthorizedApplications": [],
    "publisherDomain": "papayee008.onmicrosoft.com",
    "replyUrlsWithType": [
        {
            "url": "https://localhost:3000",
            "type": "Web"
        },
        {
            "url": "https://localhost:44302/",
            "type": "Web"
        },
        {
            "url": "https://localhost:44302/signin-oidc",
            "type": "Web"
        },
        {
            "url": "https://localhost:44351",
            "type": "Web"
        },
        {
            "url": "http://localhost:5000/",
            "type": "Web"
        },
        {
            "url": "https://localhost:5001/",
            "type": "Web"
        },
        {
            "url": "https://localhost:8666",
            "type": "Web"
        },
        {
            "url": "https://localhost:44394/",
            "type": "InstalledClient"
        },
        {
            "url": "https://login.microsoftonline.com/common/oauth2/nativeclient",
            "type": "InstalledClient"
        },
        {
            "url": "https://localhost",
            "type": "Web"
        },
        {
            "url": "https://localhost:44394/signin-oidc",
            "type": "Web"
        },
        {
            "url": "https://localhost:44394",
            "type": "Web"
        }
    ],
    "requiredResourceAccess": [
        {
            "resourceAppId": "28xxxx12",
            "resourceAccess": [
                {
                    "id": "98xxxx5a",
                    "type": "Scope"
                },
                {
                    "id": "20xxxx7a",
                    "type": "Scope"
                }
            ]
        },
        {
            "resourceAppId": "0fxxxxa0",
            "resourceAccess": [
                {
                    "id": "1fxxx6a",
                    "type": "Scope"
                }
            ]
        },
        {
            "resourceAppId": "00xxx00",
            "resourceAccess": [
                {
                    "id": "18xxx10",
                    "type": "Scope"
                },
                {
                    "id": "3bxxxd5",
                    "type": "Scope"
                }
            ]
        },
        {
            "resourceAppId": "00xxx00",
            "resourceAccess": [
                {
                    "id": "64xxxd0",
                    "type": "Scope"
                },
                {
                    "id": "74xxx82",
                    "type": "Scope"
                },
                {
                    "id": "37xxx6e",
                    "type": "Scope"
                },
                {
                    "id": "14xxxc1",
                    "type": "Scope"
                },
                {
                    "id": "5cxxx65",
                    "type": "Scope"
                },
                {
                    "id": "57xxxca",
                    "type": "Scope"
                },
                {
                    "id": "02xxx73",
                    "type": "Scope"
                },
                {
                    "id": "e1xxxx3d",
                    "type": "Scope"
                },
                {
                    "id": "b4xxx4c",
                    "type": "Scope"
                }
            ]
        }
    ],
    "samlMetadataUrl": null,
    "signInUrl": null,
    "signInAudience": "AzureADandPersonalMicrosoftAccount",
    "tags": [],
    "tokenEncryptionKeyId": null
}

А вот и манифест для PapayeeClient

{
    "id": "59xxxxe9",
    "acceptMappedClaims": null,
    "accessTokenAcceptedVersion": 2,
    "addIns": [],
    "allowPublicClient": null,
    "appId": "02xxx60",
    "appRoles": [],
    "oauth2AllowUrlPathMatching": false,
    "createdDateTime": "2020-04-13T22:34:14Z",
    "groupMembershipClaims": null,
    "identifierUris": [],
    "informationalUrls": {
        "termsOfService": null,
        "support": null,
        "privacy": null,
        "marketing": null
    },
    "keyCredentials": [],
    "knownClientApplications": [],
    "logoUrl": null,
    "logoutUrl": null,
    "name": "PapayeeClient",
    "oauth2AllowIdTokenImplicitFlow": true,
    "oauth2AllowImplicitFlow": true,
    "oauth2Permissions": [],
    "oauth2RequirePostResponse": false,
    "optionalClaims": null,
    "orgRestrictions": [],
    "parentalControlSettings": {
        "countriesBlockedForMinors": [],
        "legalAgeGroupRule": "Allow"
    },
    "passwordCredentials": [],
    "preAuthorizedApplications": [],
    "publisherDomain": "papayee008.onmicrosoft.com",
    "replyUrlsWithType": [
        {
            "url": "https://localhost:3000/",
            "type": "Web"
        },
        {
            "url": "https://localhost:8080/",
            "type": "Web"
        }
    ],
    "requiredResourceAccess": [
        {
            "resourceAppId": "28xxx12",
            "resourceAccess": [
                {
                    "id": "98xxx5a",
                    "type": "Scope"
                },
                {
                    "id": "20xxx7a",
                    "type": "Scope"
                }
            ]
        },
        {
            "resourceAppId": "00xxx00",
            "resourceAccess": [
                {
                    "id": "64xxxd0",
                    "type": "Scope"
                },
                {
                    "id": "74xxx82",
                    "type": "Scope"
                },
                {
                    "id": "37xxxx6e",
                    "type": "Scope"
                },
                {
                    "id": "14xxxc1",
                    "type": "Scope"
                },
                {
                    "id": "57xxxxca",
                    "type": "Scope"
                },
                {
                    "id": "02xxx73",
                    "type": "Scope"
                },
                {
                    "id": "e1xxxxx3d",
                    "type": "Scope"
                }
            ]
        }
    ],
    "samlMetadataUrl": null,
    "signInUrl": null,
    "signInAudience": "AzureADandPersonalMicrosoftAccount",
    "tags": [],
    "tokenEncryptionKeyId": null
}

1 Ответ

0 голосов
/ 22 апреля 2020

Ваша архитектура абсолютно верна. Ваш сценарий на стороне клиента вызов вашего сервера webapi -> вызов сервера webapi Microsoft Graph API .

Вот примеры, которые будут полезны в вашем проекте:

Памятка о том, как реализовать Azure аутентификацию AD с использованием React и. NET Core

Вызов нижестоящего веб-API (Microsoft Graph) из веб-API, защищенного платформой идентификации Microsoft (Azure Active Directory), с использованием потока от имени

...