私はこれを2日間理解しようとしてきましたが、助けを求める時が来ました. セットアップは次のとおりです。
次のパッケージで Umbraco 7.5.6 を実行します。
- UmbracoIdentity 5.0.0
- UmbracoCms.IdentityExtensions 1.0.0
- UmbracoCms.IdentityExtesnions.AzureActiveDirectory 1.0.0
Thinktecture SSO サーバーも実行しています
- IdentityServer3
要件は次のとおりです。
- バック オフィス ユーザーは、AAD または内部ユーザー経由でログインする必要があります (これは完了しており、機能しています)。
- メンバーは、Thinktecture SSO サーバー経由でログインする必要があります
- メンバーがホームページにいない場合は、ログインに成功した後、アクセスしようとしていたページにリダイレクトする必要があります。
これはすべて簡単に思えるので、これまでのコードを次に示します。これは、Owin スタートアップ プロセスに固執するために私が作成したミドルウェアです。
public static IAppBuilder ConfigureFrontEndSsoAuth(this IAppBuilder app)
{
//var postLoginRedirectUrl = "";
var ssoOptions = new OpenIdConnectAuthenticationOptions
{
SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
Authority = Config.SsoAuthority,
ClientId = Config.SsoClientId,
CallbackPath = new PathString("/umbraco/surface/UmbracoIdentityAccount/ExternalLoginCallback"),
RedirectUri = "http://bacp.dev/umbraco/surface/UmbracoIdentityAccount/ExternalLoginCallback",
ResponseType = Config.SsoResponseType,
Scope = Config.SsoScope,
AuthenticationMode = AuthenticationMode.Passive,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
SecurityTokenValidated = async x =>
{
// Will deal with Claims soon
}
}
};
ssoOptions.Caption = "Member SSO";
ssoOptions.AuthenticationType = String.Format(CultureInfo.InvariantCulture, Config.SsoAuthority);
ssoOptions.SetExternalSignInAutoLinkOptions(new ExternalSignInAutoLinkOptions(autoLinkExternalAccount: true));
app.UseOpenIdConnectAuthentication(ssoOptions);
return app;
}
これが私の2つのコントローラーメソッドです。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl = null)
{
if (returnUrl.IsNullOrWhiteSpace())
{
returnUrl = Request.RawUrl;
}
// Request a redirect to the external login provider
return new ChallengeResult(provider,
Url.SurfaceAction<UmbracoIdentityAccountController>("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
}
[HttpGet]
[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl = null)
{
if (String.IsNullOrEmpty(returnUrl))
{
returnUrl = "/";
}
var loginInfo = await OwinContext.Authentication.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
//go home, invalid callback
return RedirectToLocal(returnUrl);
}
// Sign in the user with this external login provider if the user already has a login
var user = await UserManager.FindAsync(loginInfo.Login);
if (user != null)
{
await SignInAsync(user, isPersistent: false);
return RedirectToLocal(returnUrl);
}
else
{
// If the user does not have an account, then prompt the user to create an account
ViewBag.ReturnUrl = returnUrl;
ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
}
}
最後に、ビューでのログイン アクション:
<form action="/Umbraco/surface/UmbracoIdentityAccount/ExternalLogin" method="post">
@Html.AntiForgeryToken()
<input type="hidden" name="provider" value="@Config.SsoAuthority"/>
<input type="hidden" name="returnUrl" value="@Request.RawUrl"/>
<input type="submit" class="profile-summary__link" value="Login"/>
</form>
さて、これは私が道に迷う場所であり、本当に小さなものか何かを見落としているだけです。次の手順が当面の問題です。
- Umbraco ページが読み込まれます
- 「ログイン」をクリックして SSO サーバーにリダイレクトできます
- ログインしていない場合は、ログインします | ログインしている場合、Cookie が検証され、返信が返されます
- それは私をExternalLoginCallbackに送っていると主張していますが、コントローラーメソッドにブレークポイントを設定すると、ヒットすることはありません。
- 次に、ExternalLogin にリダイレクトしようとします (どこから取得しているのかわかりません)。
どんな助けや提案も素晴らしいでしょう。