現在、新しくリリースされたAsp.Net Core 2.0と特に偽造防止トークンで、Angular 4(4.3.5)でセキュリティが正しく動作するようにしています。ValidateAntiForgeryTokenがAngular 4とAsp.Net Core 2で動作するようにする
私はJavascriptServicesを使用しています.JavascriptServicesは、スターターアプリケーション(Visual Studio 2017.3のデフォルトAngularテンプレート)を提供しています。 Javascriptサービスは、.cshtmlページのAngularサイトのメインページをホストします。ユーザーがそうでないときに、/ Account/Loginの別の(非Angular)ログインページにユーザーをリダイレクトする標準フォーム認証(dot net core Identity)を使用してすべてをロックすることができるので、これは実際にはかなり有益ですログインすると、そのページにログインしてホームページにリダイレクトされ、スパが認証されたユーザーのコンテキスト内で起動して実行されます。
その作業アプリケーションはhereです。
パズルの最後の部分は、ValidateAntiForgeryToken属性を取得することです。これはAngle 4のコンテキストでは実行されていないため、Account/Loginページにログインすると問題ありません。しかし、ホームページのAngular 4内で実行しているときに、サーバーにポストバックすると、投稿がその属性が存在する場合、ValidateAntiForgeryTokenによってブロックされます。
このため、私はAccount/LogoutメソッドのValidateAntiForgeryToken属性をコメントアウトしました。これは、Angular http postを使用してサイトからログアウトしているためです。これは、属性が使用されていないときに機能しますが、使用されると失敗するかブロックされます。
Angular 4の文書に続いてhereが見つかりましたが、Angular 4が認識しているものと一致するようにAnti Whery Tokenの名前を変更しました。次のようにこれを行うために、私は、いくつかの行に追加して、私のStartup.csファイルを変更:
public void ConfigureServices(IServiceCollection services)
{
services.AddAntiforgery(options =>
{
options.Cookie.Name = "XSRF-TOKEN";
options.Cookie.HttpOnly = false;
});
...
}
これは名前角度4つのを期待してアンチ偽造クッキーにアクセスするための角度アプリを有効にする必要があります。
私のアプリでは、新しいHttpClientサービス(明らかにHttpサービスは廃止されました!)を使用するように変更しました。これはインターセプタを使用してXSRF_TOKENをサーバーに自動的に送信することになっています。
しかし、私はこの作業を行うことができませんでした。
let token = this.cookieService.get("XSRF-TOKEN");
console.log(token);
var httpHeaders = new HttpHeaders({ 'XSRF-TOKEN': token })
this.httpClient.post(this.baseUrl + 'Account/Logout', "", { headers: httpHeaders }).subscribe(result => {
location.replace("/");
}, error => {
console.error(error);
})
私はとして、コメントを追加ヘッダーなしの両方古いサービスを使用してみました
:
this.httpClient.post(this.baseUrl + 'Account/Logout', "", options).subscribe(result => {
location.replace("/");
}, error => {
console.error(error);
})
は私が手動でヘッダを追加してみました:
私はHttpClientをサービスを使用して、標準的なポストコールを試してみましたlet token = this.cookieService.get("XSRF-TOKEN");
console.log(token);
let headers = new Headers({
//'Content-Type': 'application/json',
'X-XSRF-TOKEN': token
});
let options = new RequestOptions({ headers: headers });
this.http.post(this.baseUrl + 'Account/Logout', "", options).subscribe(result => {
location.replace("/")
}, error => console.error(error));
残念ながら、私は運がありませんでした。誰かがこれを稼働させることができましたか?