4

私は自分のプロジェクト内から平らなjsonファイルを取得する簡単なデータリソースを持っています。 urlを別のドメインで動作している作業APIエンドポイントのものに置き換えると、Chromeで401(Unauthorized)エラーが発生します。http-clientを使用してAureliaでクロスドメインをリクエストする方法

セットアップ:私は2つのプロジェクトでVisual Studioソリューションを用意しています。 AspNet.cors/W

1)RateAppAPI(WebAPIのプロジェクト)
2)RateAppClientAurelia/W ASPNET 5テンプレート)
3)IはフラットファイルAPIエンドポイントサービングの両方を有します同じjson文書を作成する。コードにコメントされているものとコメントされていないものが表示されます。

  1. APIプロジェクトは問題なく私のGETALLルートにサービスを提供している、私は 郵便配達を使用してエンドポイントを打つことができると私は戻って JSONの大きな結果を得ることができます。私はCORSを有効にして正しく設定しましたが、私はそれを問題として と判断しました。
  2. 私はwwwrootディレクトリ でアウレリアを実行しているクライアントのプロジェクトを持っていると私は私がのためのコード を提供しますaurelia-http-clientを使用していますが、私は例は、私が でフラット・ファイルを使用して何の問題も作品を提供しないことを教えてくれますよう私は 内のディレクトリにクライアントプロジェクトを持っています。
  3. 私自身のプロジェクト(もちろん)内のフラットファイルでGet()リクエストを指す限り、私はデータを引き込み、それに取り組むことに問題はありません。私が401(Unauthorized)エラーが発生した別のドメインにあるエンドポイントを指すようにURLを切り替えるときだけです。

ここでは、データリソースである私のコード(ES6 Aureliaモジュール)である:1日の終わりに

import {inject} from "aurelia-framework"; 
import {HttpClient} from "aurelia-http-client"; 

let baseURL = "http://localhost/RateAppAPI/api/UtilZip/ByUtil/7"; 
//let baseURL = "../api/utilzip/utilzip.json"; 

@inject(HttpClient) 

export class UtilZipData { 

constructor(httpClient) { 
    this.http = httpClient; 
    this.http.configure(x => { x.withCredentials(); }); 
} 

getAll() { 
    return this.http.get(baseURL) 
     .then(response => { 
      return response.content; 
     }); 
    } 
} 

、私は、Windows認証を使用する方法を理解し、できるようにする必要があります

public static void Register(HttpConfiguration config) 
{ 
    var cors = new EnableCorsAttribute("http://localhost:1234/", "*", "*"); 
    config.EnableCors(cors); 
    config.MapHttpAttributeRoutes(); 

    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 
} 
:1つのドメインからのクライアントアプリケーションを実行するために、そのドメイン localhost:1234を呼び出し、別のドメインにアクセスすることができます、APIがCORSには、以下の方法を使用して有効になりますAPIドメイン localhost/RatAppAPIを呼び出すことができます

enter image description here

+0

どうやら、重要な問題は、APIエンドポイントの承認である私のAPIには、以下の使用して終了しました。私はそれ以上のことを言う 'windows認証 'は知らないが、Aureliaやその' http-client'に特有のものであってはならない。このコメントが私のように誤解を招くような人に役立つことを願っています。 – qtuan

+0

私はここで何をやっていたのかを完全に把握しました。問題がどこにあるのか分かりません。これはうまくいくはずですが、どこか(API内)またはクライアントアプリケーション内で、http getとそのエンドポイントにアクセスするためのAPIによる承認との間に何か間違っています。 –

+1

エリック、あなたの許可された起源の末尾にスラッシュをドロップするだけで、すべての作業を開始する必要があります... – Shaun

答えて

3

まず、元のスラッシュを削除することをお勧めします。私はそれがあなたのためにいくつかの問題を引き起こしているものであるかなり確信しています:

var cors = new EnableCorsAttribute("http://localhost:1234/", "*", "*"); 
//Should be the following instead 
var cors = new EnableCorsAttribute("http://localhost:1234", "*", "*"); 

はまた、あなたはその後、あなたはIIS上でホスティングされようとしていると、すべてのあなたのコントローラのアクションにグローバルに同じCORSポリシーを適用するために探していると仮定します同様コンフィグからそれを行うことができます。

<configuration> 
    <system.webServer> 
     <httpProtocol> 
      <customHeaders> 
       <add name="Access-Control-Allow-Origin" value="http://localhost:1234" /> 
       <add name="Access-Control-Allow-Methods" value="*" /> 
       <add name="Access-Control-Allow-Headers" value="*" /> 
      </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
</configuration> 

をまたIISオプションのハンドラは、物事に干渉するので、それはつまり、削除されていることを確認してあなたはまた、次の引数--disable-web-security --user-data-dirでそれを起動するのいずれかによって、クロムでCORSのセキュリティを無効にするか、localhostのホスト・ファイルにエイリアスを作成し、instead.Thisが本当にすべきではないことを使用して試すことができます最後の手段として

<system.webServer> 
    <handlers> 
    ... 
     <remove name="OPTIONSVerbHandler"/> 
    ... 
    </handlers> 
</system.webServer> 

すべてのヘッダーが正しく設定されていれば必要です。

資格情報を送信しようとしているので、許可されたドメインにワイルドカードを使用することはできません。私は言わずに行くと思う:)。それは言われていると、あなたはまた、次の操作を行う必要があるかもしれません:

var cors = new EnableCorsAttribute("http://localhost:1234", "*", "*") 
{ 
    SupportsCredentials = true 
}; 
+0

まず、お時間をいただきありがとうございます。私はそれがWeb API側にあると思ったが、私は確信が持てませんでした。それが私が完全な話をした理由です。フォワードスラッシュを削除し、原点を1つの場所に設定するだけの組み合わせは、解決策のようです。私はいくつかのテストをしましょう、私はレトロで私の発見を提供します。 –

+0

全く問題はありませんでした。時には、このようなものを見つけるためにもう一組の目が必要な場合もあります。 – Shaun

+0

私はすべてをよりよく理解したいと思っています。私はいくつかの興味深いやりがいのある回答を見つけました。そして、私は有効化を無効にして、クライアントを実行してリソースを使用することもできました。非常に奇妙な。しかし、それは働いています。もし私がいくつかの画像とあなたの見解のいくつかの説明をホストしたら、あなたはそれを見ていたでしょうか? –

0

は私がGlobal.asaxのは

public void Application_BeginRequest(object sender, EventArgs e) 
     { 
    string httpOrigin = Request.Params["HTTP_ORIGIN"] ?? "*"; 

    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", httpOrigin); 

    //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, PUT"); 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, dataType"); 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); 

    if (Request.HttpMethod == "OPTIONS") 
    { 
     HttpContext.Current.Response.StatusCode = 200; 
     var httpApplication = sender as HttpApplication; 
     httpApplication?.CompleteRequest(); 
    } 
} 
関連する問題