2016-04-04 26 views
3

一般的なADアカウントからSkype for Businessオンライン経由で通知/通知をユーザーに送信できるC#コンソールアプリケーションを設定しようとしています。先日、このページによれば、UCWAは現在Skype for Businessのオンラインでサポートされていることがわかりました:https://msdn.microsoft.com/en-us/library/office/mt650889.aspxSkype for Business Onlineをコンソールアプリケーションから送信する

私はこのチュートリアルに従うことで、このセットアップを実現しようとしています:https://msdn.microsoft.com/en-us/library/office/mt590891(v=office.16).aspx。これまで私は本当に多くの運がなかった...私はAzureのADで私のアプリケーションを設定しているが、私は "暗黙のグラントフローを使用してアクセストークンを要求している"私は

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は、オフィスのオンラインログオンページではなく、アクセストークンです:

 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方法:これまでのところ、私はこれを持っている...)のいずれかその前に正しい行動を取ります前方に進む必要があるので...私は立ち往生しています。上記のコードのかなりのバリエーションを試しました。

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

答えて

3

は私がADAL

使用してAADに複数の認証トークンを要求伴う手順ここで Authentication using Azure AD

で説明する手順の助けを借りて、ADAL(V3)を使用して作業溶液に来ました

  • Azure ADにネイティブアプリケーションとしてアプリケーションを登録します。
  • ユーザーのUCWAルートリソースURIを検索するための自動検出を実行します。
    これはUCWAルートリソースのアクセストークンが例えばADAL
    を使用して、自動検出応答で返されたリクエスト、ルートリソースが https://webdir0e.online.lync.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=yourdomain.onmicrosoft.comになります
    GET https://webdir.online.lync.com/Autodiscover/AutodiscoverService.svc/root?originalDomain=yourdomain.onmicrosoft.com

  • にGETリクエストを実行することにより行うことができますあなたがADALから取得したベアラ・トークンを持つルートリソースのGETを実行し、リソースhttps://webdir0e.online.lync.com/

  • のためのAADからトークンを取得する必要があります
    GET https://webdir0e.online.lync.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=yourdomain.onmicrosoft.com

  • これは、ユーザーリソース内で、アプリケーションリソースのURI、UCWAアプリケーションを作成する場所を返します。これは私の場合です:
    https://webpoolam30e08.infra.lync.com/ucwa/oauth/v1/applications
    は、認証トークンに含まれていない、別のドメイン、したがって、異なる聴衆/リソースで、その後在住以前

  • がホームプールホストリソースのためのAADから新しいトークンを取得obatainedそして、アプリケーションリソースは、(私の場合はhttps://webpoolam30e08.infra.lync.com

  • はADAL

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

Voilá、あなたのUCWAアプリケーションが作成されます。私が現時点で気付いているのは、)を除いたわずかなリソースしかありません。/presenceです。したがって、ユーザーのプレゼンスは取得できますが、自己プレゼンスの状態は変更できません。 私は私の個人的なメモを検索することができましたし、次のリソースが私に用意されています

  • 通信
  • 会議

は私にいくつかのコードを表示します

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

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; 
} 

使用コードATOは、ADALを使用してハードコーディングユーザー名とパスワードを避けるために、もちろん可能でなければなりませんが、これはとしてのPoCのためのより簡単で、特にコンソールアプリケーションの場合にあったADAL

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); 

を使用してOAuthのトーク​​ンを取得しますあなたは尋ねた

+0

ADALを使用して自動検出応答で返されたUCWAルートリソースのアクセストークンを要求しているときにステップ3でスタックされた場合、次のエラーが表示されます: 'https://webdir1a.online.lync.com/Autodiscover/AutodiscoverServiceという名前のアプリケーション.svc/root/oauth/user?originalDomain = xxxxx.onmicrosoft.comは、xxxxx.onmicrosoft.comという名前のテナントには見つかりませんでした。これは、アプリケーションがテナントの管理者によってインストールされていないか、またはテナントの任意のユーザーが同意していない場合に発生します。「ネイティブのAADアプリケーションが登録されており、正しいアプリIDを使用しています...アイデアはありますか? –

+0

AcquireTokenAsyncに渡すURIがホストURIのみであることを確認してください(例: 'https:// webdir1a.online.lync.com')。パスパーツを含めないでください –

+0

ありがとうございます。それが私の問題でした。私は今、仕事をしている。 –

1

私はちょうどこれについてusing a start-to-finish exampleについてブログしましたが、うまくいけば助けになるでしょう。私はサインインするだけですが、Skype Web SDK here(13日目と14日目を参照)を使用してIMを送信し、2つを結合した別の投稿でも使用できます。

-tom

+0

これは素晴らしい情報です。ありがとうございます。しかし、私の場合は、ブラウザのjavascriptではなく、User REST APIを使用してC#で直接コンソールアプリケーションを使用してこれを達成しようとしています。 –

0

私は彼らが今日この話をしたと思う - 私はSkype Web SDKサンプルと無関係なことをしていて、新しいAzure ADアプリケーションを作成しなければならなかった。ユーザー情報を変更する

今、GithubサンプルのすべてがSkype For Business Onlineで動作します。マッシモのソリューションと同様に

enter image description here

1

は、私が署名し、会議や変更、ユーザーのプレゼンスを/ /リストを作成、削除するUCWAを使用する方法を示しているa Skype for Business Online C# based console appを作成しました。私はIMを送るためにそれを拡張しようとしていませんでしたが、私のリポジトリを複製し、あなたのニーズに拡張することは間違いありません。あなたのAzure ADテナント名とネイティブアプリIDをコードにドロップしてください。

関連する問題