3

一般的な AD アカウントからオンラインで Skype for Business を介してユーザーに通知/リマインダーを送信できる C# コンソール アプリをセットアップしようとしています。先日、このページによると、UCWA がオンラインの Skype for Business でサポートされるようになったことを見て興奮しました: https://msdn.microsoft.com/en-us/library/office/mt650889.aspx .

このチュートリアルに従って、このセットアップを取得しようとしています: https://msdn.microsoft.com/en-us/library/office/mt590891(v=office.16).aspx。これまでのところ、あまり運が良くありませんでした... Azure AD でアプリケーションをセットアップしましたが、その記事の「暗黙的な許可フローを使用してアクセス トークンを要求する」手順で行き詰まりました (100% 確信が持てるわけではありません)。その前に正しい行動を取るかのいずれか)...これまでのところ、私はこれを持っています:

        string clientId = "xxxxxxxx"
        string resourceUri = "https://webdir.online.lync.com";
        string authorityUri = "https://login.windows.net/common/oauth2/authorize";
        AuthenticationContext authContext = new AuthenticationContext(authorityUri);
        UserCredential cred = new UserCredential("username", "password");
        string token = authContext.AcquireToken(resourceUri, clientId, cred).AccessToken;


        var poolReq = CreateRequest("https://webdir.online.lync.com/autodiscover/autodiscoverservice.svc/root", "GET",token);
        var poolResp = GetResponse(poolReq);

        dynamic tmp = JsonConvert.DeserializeObject(poolResp);
        string resourcePool = tmp._links.user.href;

        Console.WriteLine(resourcePool);

        var accessTokenReq = CreateRequest("https://login.windows.net/common/oauth2/authorize"
            + "?response_type=id_token"
            + "&client_id=" + clientId
            + "&redirect_uri=https://login.live.com/oauth20_desktop.srf"
            + "&state=" + Guid.NewGuid().ToString()
            + "&resource=" + new Uri(resourcePool).Host.ToString()
            , "GET",token);
        var accessTokenResp = GetResponse(accessTokenReq);

私の GetResponse および CreateRequest メソッド:

    public static string GetResponse(HttpWebRequest request)
    {
        string response = string.Empty;

        using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse)
        {
            //Get StreamReader that holds the response stream
            using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream()))
            {
                response = reader.ReadToEnd();
            }
        }

        return response;
    }



    public static HttpWebRequest CreateRequest(string uri, string method, string accessToken)
    {
        HttpWebRequest request = System.Net.WebRequest.Create(uri) as System.Net.HttpWebRequest;
        request.KeepAlive = true;
        request.Method = method;
        request.ContentLength = 0;
        request.ContentType = "application/json";
        request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken));

        return request;
    }

accessTokenResp はオフィスのオンライン ログオン ページであり、先に進むために必要なアクセス トークンではありません。上記のコードのかなりのバリエーションを試しました。

より多くの例を求めてネットを探し回っていますが、特に Office 365 の UCWA サポートが非常に新しいため、実際には何も見つかりません。誰かが私がやろうとしていることを実行する方法の例を持っているか、または私にそれを指摘することができますか? 私がこれまでに見つけたものはすべて、私が試みているものに近いものではありませんでした. 残念ながら、Skype for Business クライアント SDK も使用できません。要件をすべて満たしていないからです。

4

4 に答える 4

4

「 Azure AD を使用した認証」で説明されている手順の助けを借りて、ADAL (v3)を使用して実用的なソリューションにたどり着きました

ADAL を使用して AAD に複数の認証トークンを要求する手順を次に示します。

  • アプリケーションをネイティブ アプリケーションとして Azure AD に登録します。
  • 自動検出を実行して、ユーザーの UCWA ルート リソース URI を見つけます。
    これは、GETリクエストを実行することで実行できます
    GET https://webdir.online.lync.com/Autodiscover/AutodiscoverService.svc/root?originalDomain=yourdomain.onmicrosoft.com

  • ADAL を使用して、自動検出応答で返された UCWA ルート リソースのアクセス トークンを要求し
    ます https://webdir0e.online.lync.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=yourdomain.onmicrosoft.com
    https://webdir0e.online.lync.com/

  • ADAL から取得したベアラー トークンを使用して、ルート リソースに対して GET を実行します。
    GET https://webdir0e.online.lync.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=yourdomain.onmicrosoft.com

  • これにより、ユーザー リソース内で、UCWA アプリケーションを作成するアプリケーション リソースの URI が返されます。私の場合、これは次のとおりです。
    https://webpoolam30e08.infra.lync.com/ucwa/oauth/v1/applications
    別のドメインに存在するため、オーディエンス/リソースが異なり、以前に取得した認証トークンには含まれていません

  • ホーム プールとアプリケーション リソースがあるホスト リソースの AAD から新しいトークンを取得します (https://webpoolam30e08.infra.lync.com私の場合)。

  • ADAL から取得したトークンを使用して、アプリケーション URI で POST を実行し、新しい UCWA アプリケーションを作成します。

これで、UCWA アプリケーションが作成されました。現時点で気付いたのは、/プレゼンスを除いて、利用できるリソースがほとんどないということです. したがって、ユーザーのプレゼンスは取得できますが、自己のプレゼンス ステータスは変更できません。しかし、個人的なメモを取り戻すことができました。次のリソースを利用できます。

  • コミュニケーション
  • ミーティング

いくつかのコードを見せてください:

認証トークンの取得と切り替えを行うフローを行う機能

public static async Task<UcwaApp> Create365UcwaApp(UcwaAppSettings appSettings, Func<string, Task<OAuthToken>> acquireTokenFunc)
{
    var result = new UcwaApp();
    result.Settings = appSettings;

    var rootResource = await result.Discover365RootResourceAsync(appSettings.DomainName);
    var userUri = new Uri(rootResource.Resource.GetLinkUri("user"), UriKind.Absolute);
    //Acquire a token for the domain where user resource is
    var token = await acquireTokenFunc(userUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped));
    //Set Authorization Header with new token
    result.AuthToken = token;
    var usersResult = await result.GetUserResource(userUri.ToString());
    //
    result.ApplicationsUrl = usersResult.Resource.GetLinkUri("applications");
    var appsHostUri = new Uri(result.ApplicationsUrl, UriKind.Absolute).GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped);
    //Acquire a token for the domain where applications resource is
    token = await acquireTokenFunc(appsHostUri);
    //Set Authorization Header with new token
    result.AuthToken = token;
    //
    var appResult = await result.CreateApplicationAsync(result.ApplicationsUrl, appSettings.ApplicationId, appSettings.UserAgent, appSettings.Culture);

    return result;
}

ADAL を使用して OAuth トークンを取得するための使用コード

var ucSettings = new UcwaAppSettings
{
    UserAgent = "Test Console",
    Culture = "en-us",
    DomainName = "yourdomain.onmicrosoft.com",
    ApplicationId = "your app client id"
};

var acquireTokenFunc = new Func<string, Task<OAuthToken>>(async (resourceUri) =>
{
   var authContext = new AuthenticationContext("https://login.windows.net/" + ucSettings.DomainName);

   var ar = await authContext.AcquireTokenAsync(resourceUri,
                ucSettings.ApplicationId,
                new UserCredential("myusername", "mypassword"));


   return new OAuthToken(ar.AccessTokenType, ar.AccessToken, ar.ExpiresOn.Ticks);
});

var app = await UcwaApp.Create365UcwaApp(ucSettings, acquireTokenFunc);

もちろん、ADAL を使用してユーザー名とパスワードをハードコーディングすることは避けられるはずですが、これは PoC の場合、特にコンソール アプリケーションの場合は、あなたが尋ねたように簡単でした。

于 2016-04-10T12:54:50.023 に答える
1

最初から最後までの例を使用して、これについてブログを書いたところです。私はサインインするところまでしか行きませんが、Skype Web SDK を使用して IM を送信するために行った別の投稿(13 日目と 14 日目を参照) でそれを使用し、2 つを組み合わせることができます。うまくいくはずです。

-トム

于 2016-04-06T20:09:52.397 に答える