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はまだ私がログインしていると思う、私はちょうど私のアプリケーションで適切に設定されたトークンを取得していないです。
私は使用しているコードを変更/検証するためにイラストとコードを使用しました。残念ながら、同じ問題が発生しています...私がAzure ADに対して認証すると、私はIdentityServer3にリダイレクトされ、必要に応じて私のアプリケーションにはリダイレクトされません。また、IdentityServer3のクライアントが正しいRedirectUrisとPostLogoutRedirectUrisを持っていることを確認しました。私は自分のアプリケーションに戻すことはありません。 – rcastagna
上記のテストがうまくいくので、リクエストがIdentity Server3にリダイレクトされたときにエラーメッセージが表示されるかどうかを確認するために、** Fiddler **を介してHTTPリクエスト/リダイレクト/レスポンスを追跡することをお勧めします。 –