Как реализовать OAuth2 для одного инструмента, не используя его в качестве решения для авторизации моего приложения - PullRequest
0 голосов
/ 28 июня 2018

В настоящее время у меня есть сайт MVC в .NET Core, поддерживаемый общедоступным API. Мои пользователи должны войти в систему (нет [анонимных] контроллеров), и аутентификация уже успешно выполняется с использованием поставщика DotNetCore.Authentication. Все это хорошо.

То, что я сейчас пытаюсь сделать (по запросу пользователя), - это реализовать функции, позволяющие пользователю читать и просматривать свой календарь Outlook 365 на странице моего сайта. Это не кажется слишком сложным на первый взгляд ... все, что мне нужно сделать, это заставить их пройти аутентификацию через microsoftonline с моим зарегистрированным приложением, а затем - после того, как они дадут одобрение - перенаправить обратно в мое приложение, чтобы просмотреть их события в календаре что я теперь могу вытащить (возможно, используя Graph).

В принципе это кажется действительно простым и понятным. Моя путаница возникает из-за невозможности реализовать аутентификацию для одного контроллера, а не для всего сайта. Все примеры OAuth2 (или OpenID, или OWIN, или любой другой), которые я могу найти в Интернете - из которых существует бесчисленное множество - все хотят использовать авторизацию для управления User.Identity для всего сайта. Я не хочу менять свой протокол аутентификации по всему сайту; Я не хочу ничего добавлять в Startup.cs; Я не хочу, чтобы что-то выходило за рамки одного контроллера.

tldr; Есть ли способ просто позвонить по номеру https://login.microsoftonline.com/common/oauth2/v2.0/authorize (или в Facebook, или в Google, или в любое другое место) и вернуть код или токен, который я могу использовать для этого пользователя в этой области сайта, и не требовать через аутентификацию, которая уже используется для остальной части сайта?

1 Ответ

0 голосов
/ 05 июля 2018

Для всех, кто ищет этот ответ, я разобрался (после долгих проб и ошибок), как выполнить аутентификацию для одного пользователя на короткое время, без использования промежуточного программного обеспечения, которое аутентифицирует все приложение.

    public async Task<IActionResult> OfficeRedirectMethod()
    {
        Uri loginRedirectUri = new Uri(Url.Action(nameof(OfficeAuthorize), "MyApp", null, Request.Scheme));
        var azureADAuthority = @"https://login.microsoftonline.com/common";

        // Generate the parameterized URL for Azure login.
        var authContext = GetProviderContext();
        Uri authUri = await authContext.GetAuthorizationRequestUrlAsync(_scopes, loginRedirectUri.ToString(), null, null, null, azureADAuthority);

        // Redirect the browser to the login page, then come back to the Authorize method below.
        return Redirect(authUri.ToString());
    }

    public async Task<IActionResult> OfficeAuthorize()
    {
        var code = Request.Query["code"].ToString();

        try
        {
            // Trade the code for a token.
            var authContext = GetProviderContext();
            var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(code, _scopes);

            // do whatever with the authResult, here
        }
        catch (Exception ex)
        {
            System.Diagnostics.Trace.WriteLine(ex.ToString());
        }

        return View();
    }

    public ConfidentialClientApplication GetContext()
    {
        var clientId = "OfficeClientId;
        var clientSecret = "OfficeClientSecret";
        var loginRedirectUri = new Uri(@"MyRedirectUri");
        TokenCache tokenCache = new MSALSessionCache().GetMsalCacheInstance();

        return new ConfidentialClientApplication(
            clientId,
            loginRedirectUri.ToString(),
            new ClientCredential(clientSecret),
            tokenCache,
            null);
    }

Я не знаю, будет ли это когда-нибудь полезным для кого-либо, кроме меня; Я просто знаю, что это проблема, которую нелегко решить быстрым поиском.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...