0

IdentityServer3、AzureAD、およびプライベートデータベースがどのように連携して動作するかを理解するのは苦労しています。最大の問題は、リダイレクトURIがどのように処理されるかです。IdentityServer3 + AzureADとRedirectUri Confusion

私のシナリオは、私はスタンドアロンのIdentityServer3を持っています。 AzureADまたはプライベートDBのどちらかに対してユーザーを認証するのが仕事です。 ID3サーバー上のStartup.csファイルの中で、私は次のOpenID接続コードを持っている:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Map("/identity", s3App => 
     { 
      s3App.UseIdentityServer(new IdentityServerOptions 
      { 
       SiteName = "3S", 
       SigningCertificate = Certificate.Load(), 

       Factory = new IdentityServerServiceFactory() 
           .UseInMemoryUsers(InMemoryUsers.Get()) 
           .UseInMemoryClients(InMemoryClients.Get()) 
           .UseInMemoryScopes(InMemoryScopes.Get()), 

       AuthenticationOptions = new AuthenticationOptions 
       { 
        EnablePostSignOutAutoRedirect = true, 
        EnableSignOutPrompt = false, 
        IdentityProviders = ConfigureAdditionalIdentityProviders 
       } 
      }); 
     }); 
    } 

    public static void ConfigureAdditionalIdentityProviders(IAppBuilder app, string signInAsType) 
    { 
     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      AuthenticationType = "AzureAd", 
      Caption = "Login", 
      ClientId = "4613ed32-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // GUID of registered application on Azure 
      Authority = "https://login.microsoftonline.com/our-tenant-id/", 

      PostLogoutRedirectUri = "https://localhost:44348/identity", 
      RedirectUri = "https://localhost:44348/identity", 

      Scope = "openid email profile", 
      ResponseType = "id_token", 
      AuthenticationMode = AuthenticationMode.Passive, 
      SignInAsAuthenticationType = signInAsType, 
      TokenValidationParameters = new TokenValidationParameters 
      { 
       AuthenticationType = Constants.ExternalAuthenticationType, 
       ValidateIssuer = false 
      } 
     }); 
    } 

ID3 ServerはRedirectUriまたはPostLogoutRedirectUriのいずれかを持っている必要がありますなぜ私は理解していない...それいけません認証を要求しているアプリケーションから「通過」していますか?結局のところ、私たちはID3サーバーではなく、アプリケーションに戻りたいと思っています。確かに、私はこれが私の問題を引き起こしているとは思わないが、なぜこれらがここにあるのかを理解することはいいだろう。

私はこの作業に「近い」と言います。

認証が必要なアプリケーションでAzureADの認証が要求されると、Microsoftアカウントのログイン画面にリダイレクトされ、自分の仕事用アカウントのユーザー名とパスワードを入力します。私は自分の資格情報を提出し、上記のコードでRedirectUriが使用されているかどうかに応じて、ID3サーバーまたはアプリケーションにリダイレクトされます。

私はRedirectUriのために自分のアプリケーションを使っています。私はアプリケーションに送り返されますが、最初に認証の挑戦を促したページには送られません。また、認証が必要なページをクリックするとAzureADサーバーに送り返され、今度は再びログインします。AzureAD既にログインしていると認識しています。

残念ながら、AzureADからのリダイレクト後にSecurityTokenValidated通知が確認応答されているとは思われません。ここで

は、アプリケーションStartup.csで見つかったコードです:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = "Cookies" 
     }); 

     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      Authority = "https://localhost:44348/identity", 
      ClientId = "3af8e3ba-5a04-4acc-8c51-1d30f8587ced", // Local ClientID registered as part of the IdentityServer3 InMemoryClients 
      Scope = "openid profile roles", 
      RedirectUri = "http://localhost:52702/", 
      PostLogoutRedirectUri = "http://localhost:52702/", 
      ResponseType = "id_token", 

      SignInAsAuthenticationType = "Cookies", 
      UseTokenLifetime = false, 

      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       SecurityTokenValidated = n => 
       { 
        var id = n.AuthenticationTicket.Identity; 
        var givenName = id.FindFirst(Constants.ClaimTypes.GivenName); 
        var familyName = id.FindFirst(Constants.ClaimTypes.FamilyName); 
        var sub = id.FindFirst(Constants.ClaimTypes.Subject); 
        var roles = id.FindAll(Constants.ClaimTypes.Role); 

        var nid = new ClaimsIdentity(
         id.AuthenticationType, 
         Constants.ClaimTypes.GivenName, 
         Constants.ClaimTypes.Role 
         ); 

        nid.AddClaim(givenName); 
        nid.AddClaim(familyName); 
        nid.AddClaim(sub); 
        nid.AddClaims(roles); 

        nid.AddClaim(new Claim("application_specific", "Some data goes here. Not sure what, though.")); 
        nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken)); 

        n.AuthenticationTicket = new AuthenticationTicket(nid, n.AuthenticationTicket.Properties); 

        return Task.FromResult(0); 
       }, 

       RedirectToIdentityProvider = n => 
       { 
        if (n.ProtocolMessage.RequestType != OpenIdConnectRequestType.LogoutRequest) 
         return Task.FromResult(0); 

        var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token"); 

        if (idTokenHint != null) 
        { 
         n.ProtocolMessage.IdTokenHint = idTokenHint.Value; 
        } 
        return Task.FromResult(0); 
       }, 

       AuthenticationFailed = (context) => 
       { 
        context.HandleResponse(); 
        context.Response.Redirect("/Error/message=" + context.Exception.Message); 
        //Debug.WriteLine("*** AuthenticationFailed"); 
        return Task.FromResult(0); 
       }, 

      } 
     }); 

     AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject; 
     JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 
    } 
} 

あなたはOpenIdConnectAuthenticationOptionsもRedirectUriとPostLogoutRedirectUriアプリケーションへのポイントが含まれていることがわかりますが、それらは関係していないようです。

もちろん、私は物事の「クッキー」側を使ってログインしていると、すべてが完璧に機能します。私は自分のクレームをすべて見ています。マイクロソフトと電話で時間をかけて、ID3の外で解決策を提案しましたが、私たちが必要とする方法ではありません。 ID3に対して複数のアプリケーションが認証されるので、内部的にフローを管理して制御する必要があります。

私は本当にこの最後のマイルの問題を理解しようとするいくつかの助けが必要です。私は私が近くにいることを知っている、私はちょうど私がおそらく私のエラーを見て、それを見ていない、これほど長い間それを見てきた。

2016年10月22日編集
さらなる試験およびSerilogを可能にするには、RedirectUriの問題を明らかにし、PostLogoutRedirectUriは私はapp.Mapに設定された値に対応するURIの末尾に/identityを追加もたらしました。これで、IdentityServer3の「空白」ページに戻るという問題が解決されました。ここでIdentityServer3ログイン画面に戻ります。 Azure ADはまだ私がログインしていると思う、私はちょうど私のアプリケーションで適切に設定されたトークンを取得していないです。

答えて

2

認証の流れは少し複雑ですので、私は以下の図を使用して、それを説明しようとしています: enter image description here

まずリダイレクトURLは、アイデンティティプロバイダに登録する必要がありますので、サーバは、要求にRedirectURLと一致しますフィッシングサイトのようにリダイレクトするのではなく、応答が確実にリダイレクトされるようにします(セキュリティの考慮事項)。

図が示すように、Azure ADをIdentityServer3の外部IDプロバイダとして使用するには、Azure ADにアプリケーションを登録する必要があります。しかし、アプリケーションがIdentity Serverとの通信に使用されているため、Azure PortalのリダイレクトURLレジスタは、アプリケーションのURLではなくIdentityServer3にリダイレクトする必要があります。

たとえば、IDサーバー3のURLはhttps://localhost:44333です。次に、追加のIDプロバイダーを追加するために、以下のコードを使用します。

public static void ConfigureAdditionalIdentityProviders(IAppBuilder app, string signInAsType) 
{ 
     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      AuthenticationType = "aad", 
      Caption = "Azure AD", 
      SignInAsAuthenticationType = signInAsType, 

      Authority = "https://login.microsoftonline.com/04e14a2c-0e9b-42f8-8b22-3c4a2f1d8800", 
      ClientId = "eca61fd9-f491-4f03-a622-90837bbc1711", 
      RedirectUri = "https://localhost:44333/core/aadcb", 
     }); 
} 

と私のアプリのURLは、WebアプリケーションとしてIdentyServer3を追加するOWINのOpenID Connectを使用されてIdentyServer3に登録し、コードの下にあるhttp://localhost:1409/次のとおりです。そして、このURLは、AzureのポータルにリダイレクトURLですアイデンティティデータプロバイダ:

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
{ 
     AuthenticationType = "oidc", 
     SignInAsAuthenticationType = "cookies", 
     Authority = "https://localhost:44333", 
     ClientId = "mvc", 
     RedirectUri = "http://localhost:1409/", 
     ResponseType = "id_token", 
     Scope = "openid profile email" 
}); 
+0

私は使用しているコードを変更/検証するためにイラストとコードを使用しました。残念ながら、同じ問題が発生しています...私がAzure ADに対して認証すると、私はIdentityServer3にリダイレクトされ、必要に応じて私のアプリケーションにはリダイレクトされません。また、IdentityServer3のクライアントが正しいRedirectUrisとPostLogoutRedirectUrisを持っていることを確認しました。私は自分のアプリケーションに戻すことはありません。 – rcastagna

+0

上記のテストがうまくいくので、リクエストがIdentity Server3にリダイレクトされたときにエラーメッセージが表示されるかどうかを確認するために、** Fiddler **を介してHTTPリクエスト/リダイレクト/レスポンスを追跡することをお勧めします。 –