2015-10-19 69 views
5

私は単一の項目が現在のコンテキスト内のすべての項目をfronm見つけようとしているが、私は常に、このエラーメッセージを取得するように見える:EWS:「(401)不正なリモートサーバーエラーを返しました」

The request failed. The remote server returned an error: (401) Unauthorized.

var signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 

AuthenticationResult authenticationResult = null; 
AuthenticationContext authenticationContext = new AuthenticationContext(
      SettingsHelper.Authority, new model.ADALTokenCache(signInUserId)); 

authenticationResult = authenticationContext.AcquireToken(
      SettingsHelper.ServerName, 
      new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret)); 

ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2013); 
exchange.Url = new Uri(SettingsHelper.ServerName + "ews/exchange.asmx"); 
exchange.TraceEnabled = true; 
exchange.TraceFlags = TraceFlags.All; 
exchange.Credentials = new OAuthCredentials(authenticationResult.AccessToken); 

そして私は私が(IDで)受信したいものを項目定義します:まず、私は交換サービスにアクセスするために、すべてを設定

ItemView view = new ItemView(5); 
view.PropertySet = new PropertySet(BasePropertySet.IdOnly); 

var tempId = id.Replace('-', '/').Replace('_', '+'); 
SearchFilter.IsEqualTo searchid = new SearchFilter.IsEqualTo(ItemSchema.Id, tempId); 

そして最後にではなく、少なくとも、私は私の項目の中に、この項目を検索してみてください:

FindItemsResults<Microsoft.Exchange.WebServices.Data.Item> results = exchange.FindItems(WellKnownFolderName.Inbox, searchid, view); 

そして、私のエラーが発生した場所です。私はこれを行うさまざまな方法を試みましたが、私が何をしても、私は無許可になります。

誰かがこの問題を解決するために正しい方法で私を案内してくれるのでしょうか?私はコードをデバッグすることで見ることができるよう

authenticationResult = authenticationContext.AcquireToken(
      SettingsHelper.ServerName, 
      new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret)); 

:私はからアクセストークンを受け取る行う

EDIT

enter image description here

ませリフレッシュトークンはかかわらず、存在しない、これが言いたいことがある場合、私は知らないのですか?

{ 
    typ: "JWT", 
    alg: "RS256", 
    x5t: "MnC_VZcATfM5pOYiJHMba9goEKY", 
    kid: "MnC_VZcATfM5pOYiJHMba9goEKY" 
}. 
{ 
    aud: "https://outlook.office365.com/", 
    iss: "https://sts.windows.net/d35f5b06-f051-458d-92cc-2b8096b4b78b/", 
    iat: 1445416753, 
    nbf: 1445416753, 
    exp: 1445420653, 
    ver: "1.0", 
    tid: "d35f5b06-f051-458d-92cc-2b8096b4b78b", 
    oid: "c5da9088-987d-463f-a730-2706f23f3cc6", 
    sub: "c5da9088-987d-463f-a730-2706f23f3cc6", 
    idp: "https://sts.windows.net/d35f5b06-f051-458d-92cc-2b8096b4b78b/", 
    appid: "70af108f-5c8c-4ee4-a40f-ab0b6f5922e0", 
    appidacr: "1" 
}. 
[signature] 
:これは私の結果であるとして、

The access token is acquired using an authentication method that is too weak to allow access for this application. Presented auth strength was 1, required is 2

I decoded the JWT

EDITは、私はちょうど私がこれを見たところでexchange.ResponseHeadersにすべての私の方法をデバッグするために管理しました

どこから行く?過去にEWSを使用している間

+0

あなたが認証を働いてきたまで、私はハードセット「exchange.Credentials」を示唆しています... 。あなたの問題のように思われるので.. – Seabizkit

+0

exchange.Credentials =新しいWebCredentials(authEmailAddress、authEmailPassword、 "DOMAINIFYOUHAVEONE"); – Seabizkit

+0

@Seabizkitそれは動作します。これは私が最初にやったことですが、うまくいきますが、OAuthを使用したいのです – Detilium

答えて

4

私はすでに、このエラーを得た「このアプリケーションのアクセスを許可するには弱すぎるの認証方法を使用してアクセストークンを取得した。発表認証強度が必要な、1だった2である」

必要なのは、証明書を使用して認証を実施することです。

AuthenticationContext authContext = new AuthenticationContext(authority); 

exchangeService.Credentials = new OAuthCredentials(authContext.AcquireToken("https://outlook.office365.com", new ClientAssertionCertificate(ConfigurationManager.AppSettings["ida:ClientId"], certificate)).AccessToken); 

重要な部分は、ClientAssertionとして新しいClientAssertionCertificateを定義することです。

また、Azure Active Directoryアプリケーションのマニフェストを変更する必要があります。

は、この参照(「アプリケーションのX.509公開証明書の設定」についての部分)になります。https://msdn.microsoft.com/en-us/office/office365/howto/building-service-apps-in-office-365

+0

あなたの回答を編集し、この証明書がなぜ必要なの?それはアクセスがそのサービスのために非常に広いので、アプリケーションが実行しているPCを信頼する必要があるからですか? – Detilium

+0

私は、アプリの秘密だけのものよりもさらに安全な信頼を確立する以外の理由はありません。私は、「盗む/知る」秘密(文字列)は証明書よりも簡単だと思います。それは彼らがEWSがあなたに電話をかけることができる唯一の方法です。 – Trysior

+0

あなたは証明書についてもっと教えてもらいたいと思うが、これは唯一の答えであるため、私の+50代理人を得る。私はこのエラーを '401:Unauthorized'から' 403:Forbidden'に変更することができました。私はこれがAADの許可と関係があると信じています。とにかく答えをお寄せいただきありがとうございました。あなたの50人の担当者をお待ちしております:) – Detilium

関連する問題