API задач Office 365 — доступ к API с использованием фиксированных учетных данных пользователя в web.config C#

Я пытаюсь получить доступ к API задач Outlook 365, используя предопределенное имя пользователя и пароль учетной записи Microsoft, которые я помещу в файл конфигурации.

В настоящее время мое приложение перенаправляется на страницу входа в Microsoft, используя

    HttpContext.GetOwinContext().Authentication.Challenge(
              new AuthenticationProperties { RedirectUri = "/" },
              OpenIdConnectAuthenticationDefaults.AuthenticationType);

И затем я получаю токен в контексте текущего подписанного пользователя.

     string accessToken = await AuthProvider.Instance.GetUserAccessTokenAsync();
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Add("Authorization", "Bearer" + accessToken);

фрагмент GetUserAccessTokenAsync()

    string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
        HttpContextBase httpContextBase = HttpContext.Current.GetOwinContext().Environment["System.Web.HttpContextBase"] as HttpContextBase;

        SessionTokenCache tokenCache = new SessionTokenCache(signedInUserID, httpContextBase);
       Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(SettingsHelper.Authority, tokenCache);
        ClientCredential clientCredential = new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret);

        string userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
        UserIdentifier userId = new UserIdentifier(userObjectId, UserIdentifierType.UniqueId);

        try
        {
            AuthenticationResult result = await authContext.AcquireTokenSilentAsync(SettingsHelper.OutlookResourceId, clientCredential, userId);
            return result.AccessToken;
        }
        catch (AdalException ex)
        {
            HttpContext.Current.Request.GetOwinContext().Authentication.Challenge(
                new AuthenticationProperties() { RedirectUri = "/" },
                OpenIdConnectAuthenticationDefaults.AuthenticationType);

           throw new Exception(ex.Message);
        }

Но моя цель — удалить этот логин и просто использовать фиксированную учетную запись администратора для доступа к API.

возможно ли получить токен из учетных данных пользователя, которые отличаются от зарегистрированных?

Я пытаюсь найти примеры, но не могу найти ничего подходящего.

Я новичок в использовании API, поэтому я все еще учусь. :)

Любые идеи очень ценятся.

Заранее спасибо.


person Icee    schedule 27.07.2018    source источник


Ответы (1)


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

Второй вариант — использовать поток предоставления учетных данных пароля владельца ресурса. Я полагаю, что ADAL.NET не дает вам доступа к перегрузке AcquireTokenAsync, которая позволяет делать это с конфиденциального клиента, поэтому вам придется вручную выполнить HTTP-вызов, чтобы получить токены.

Вот пример ROPC:

string tokenUrl = $"https://login.microsoftonline.com/mytenant.onmicrosoft.com/oauth2/token";
var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
    ["grant_type"] = "password",
    ["client_id"] = "23d3be1b-a671-4452-a928-78fb842cb969",
    ["client_secret"] = "REDACTED",
    ["resource"] = "https://graph.windows.net",
    ["username"] = "[email protected]",
    ["password"] = "REDACTED"
});

using (var client = new HttpClient())
{
    var res = await client.SendAsync(req);

    string json = await res.Content.ReadAsStringAsync();
}

И HTTP-запрос:

POST https://login.microsoftonline.com/mytenant.onmicrosoft.com/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: login.microsoftonline.com
Content-Length: 277
Expect: 100-continue
Connection: Keep-Alive

grant_type=password&client_id=23d3be1b-a671-4452-a928-78fb842cb969&client_secret=REDACTED&resource=https%3A%2F%2Fgraph.windows.net&username=testuser%40mytenant.onmicrosoft.com&password=REDACTED

Самым большим недостатком ROPC является то, что учетная запись пользователя не может использовать MFA и не может быть федеративным пользователем. Лично я бы предпочел первый вариант, но и у него есть свои минусы. Токены обновления могут стать недействительными по определенным причинам, одной из которых является сброс пароля (хотя это также повлияет на ROPC).

person juunas    schedule 27.07.2018
comment
Большое спасибо. Я попробую. :-) - person Icee; 29.07.2018