0

私はASP.NET Core Web Appを持っており、Azure AD認証を使用したいと考えています。すべてセットアップしてローカルで作業していますが、Service Fabricインスタンスに展開すると、APIコールで再度ログインしようとするため、内部API呼び出しでエラーが発生します。Azure AD、ASP.NET Core Web App、およびService Fabric:複数のマシンで認証を取得する方法は?

掘り下げた後、私はデフォルトで、マシンキーを使ってクッキーを暗号化することを発見しました。私のSFインスタンスには複数のマシンが稼動していますが、それは原因と思われます(異なるマシンでは同じクッキーを読み取ることができないため、認証されていないと思います)。

マシン間で同じキーを使用するAAD Cookie認証を取得する方法はありますか?

これは私が現在、私のConfigureServicesコールに持っているものです。

services.AddDataProtection() 
    .SetApplicationName("my-app") 
    .ProtectKeysWithCertificate("my-thumbprint") 
    .PersistKeysToFileSystem(new DirectoryInfo("dp-keys")); 

しかし、これはまだ動作していないようです - 異なるキーは、まだ各マシン上で生成されます。現時点では、すべてのマシン間でファイルを共有する方法はありません。それが唯一の解決策になるのでしょうか、それとも他にも何かがありますか?

答えて

0

ウェブファームのシナリオでは、Cookieを保護するためにサーバー間で共有秘密を使用する必要があります。これはP&P linkにより詳細に説明されています。あなたのIDインフラストラクチャを管理するために フレームワークWindows Identity Foundation(WIF)を使用する場合、デフォルトで

は、それが Windowsのデータ保護APIを使用して、クライアントに送信するクッキーの 内容を(暗号化DPAPI)。 DPAPIをクッキー暗号化に使用する は、複数のロール インスタンスを持つアプリケーションでは、各ロールインスタンスが異なる暗号化キー を使用し、Windows Azureロードバランサが インスタンスに要求をルーティングできるため、実行可能なソリューションではありません。 2つ以上のインスタンスが共有できるキーを とするRSAなどの暗号化メカニズムを使用する必要があります。

暗号化の証明書を使用して解決しました。

new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate) 
+0

私は私の編集にいくつかのコードを追加 - 私はここにレイアウトされた解決策使用しています:https://docs.microsoftを。あなたの提案がうまくいく、私のアプリに別の設定がありますか? – justindao

+0

このブログでは、必要な3つの項目について説明しています。整列させる:http://www.paraesthesia.com/archive/2016/06/15/set-up-asp-net-dataprotection-in-a-farm/ '同期するもの'それは助けになるか? – LoekD

+0

ありがとう!私は実際に私の解決策を思いついたのですが、残念なことに私のマシンには誰もがアクセスできる共有サーバーがありません。私はAzureのBLOBが助けることができるかどうか確認します。 – justindao

1

私たちはサービスファブリックであるため、クラスタで使用できる証明書がすでに適切に配備されています。それ以外の場合は、証明書を追加する必要があります。

その後、次の操作を実行できます。

var cert = X509.LocalMachine.My.Thumbprint.Find("C03BB5A6410741CDD2927B4FF88C3E67215A393B", validOnly: false).FirstOrDefault(); 
services.AddApplicationStorageDataProtection(_container, cert); 

public static IServiceCollection AddApplicationStorageDataProtection(this IServiceCollection services, IUnityContainer container, X509Certificate2 cert) 
    { 
     if (container != null) 
     { 

      try 
      { 
       var storage = container.Resolve<IApplicationStorageService>(); 
       var token = storage.GetApplicationStorageSharedAccessSignature().GetAwaiter().GetResult(); 
       var name = storage.GetApplicationStorageAccountNameAsync().GetAwaiter().GetResult(); 
       var a = new CloudStorageAccount(new StorageCredentials(token), name, null, true); 
       var c = a.CreateCloudBlobClient().GetContainerReference("dataprotection"); 
       c.CreateIfNotExists(); 

       services.AddDataProtection() 
       .ProtectKeysWithCertificate(cert) 
       .PersistKeysToAzureBlobStorage(c.GetBlockBlobReference("dummy.csrf")); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
       throw; 
      } 
     } 

     return services; 
    } 

あなたが原因のニーズにコードを変更する必要があります。ここで提供されているコードは、クラスタ内にデプロイされたストレージサービスを使用しているため、すべてのアプリケーションでストレージの資格情報を管理する必要はありませんが、単にストレージサービスに資格情報を問い合わせることができます。私が使用している基本的なDIフレームワーク。

だから、あなたが必要とする部分がある:

services.AddDataProtection() 
       .ProtectKeysWithCertificate(cert) 
       .PersistKeysToAzureBlobStorage(c.GetBlockBlobReference("dummy.csrf")); 
+0

ありがとう!私はAzure Blobを試してみましたが、私はまだそれを知りませんでしたが、私はそれを撃つでしょう! – justindao

関連する問題