1

私はこれを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>

さて、これは私が道に迷う場所であり、本当に小さなものか何かを見落としているだけです。次の手順が当面の問題です。

  1. Umbraco ページが読み込まれます
  2. 「ログイン」をクリックして SSO サーバーにリダイレクトできます
  3. ログインしていない場合は、ログインします | ログインしている場合、Cookie が検証され、返信が返されます
  4. それは私をExternalLoginCallbackに送っていると主張していますが、コントローラーメソッドにブレークポイントを設定すると、ヒットすることはありません。
  5. 次に、ExternalLogin にリダイレクトしようとします (どこから取得しているのかわかりません)。

ここに画像の説明を入力

どんな助けや提案も素晴らしいでしょう。

4

0 に答える 0