Umbraco 7.6的Active Directory身份验证卡在重定向循环中

时间:2017-05-04 13:04:18

标签: azure authentication active-directory owin umbraco

我目前正在使用Umbraco库来扩展身份验证的可能性,并使用Active Directory启用后台身份验证。

https://github.com/umbraco/UmbracoIdentityExtensions

安装库并按照下面的博客文章后,我能够显示外部登录按钮,使用Active Directory进行身份验证,并向Umbraco数据库添加用户和外部登录。

https://www.jdibble.co.uk/blog/securing-umbraco-backoffice-with-azure-active-directory/

然后以连续循环的方式将您发送回/ umbraco登录页面。正如此博文https://our.umbraco.org/forum/developers/extending-umbraco/75256-login-uisng-azure-ad-redirects-allways-to-login-page

所述

有人遇到过这个问题并解决了吗?或者有任何有用的建议?

正在使用的代码......

   public static void ConfigureBackOfficeAzureActiveDirectoryAuth(this IAppBuilder app,
          string tenant, string clientId, string postLoginRedirectUri, Guid issuerId,
          string caption = "Active Directory", string style = "btn-microsoft", string icon = "fa-windows")
    {
        var authority = string.Format(
            CultureInfo.InvariantCulture,
            "https://login.microsoftonline.com/{0}",
            tenant);

        var adOptions = new OpenIdConnectAuthenticationOptions
        {
            SignInAsAuthenticationType = Constants.Security.BackOfficeExternalAuthenticationType,
            ClientId = clientId,
            Authority = authority,
            RedirectUri = postLoginRedirectUri,
            AuthenticationMode = AuthenticationMode.Passive,
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthorizationCodeReceived = async context =>
                {
                    if (System.Diagnostics.Debugger.IsAttached)
                        System.Diagnostics.Debugger.Break();

                    var userService = ApplicationContext.Current.Services.UserService;

                    var stuff = (List<Claim>)context.JwtSecurityToken.Claims;

                    var email = stuff.FirstOrDefault(x => x.Type == "unique_name").Value;
                    var issuer = stuff.FirstOrDefault(x => x.Type == "iss").Value;
                    var providerKey = stuff.FirstOrDefault(x => x.Type == "sub").Value;
                    var name = stuff.FirstOrDefault(x => x.Type == "name").Value;

                    var userManager = context.OwinContext.GetUserManager<BackOfficeUserManager>();

                    var user = userService.GetByEmail(email);

                    if (user == null)
                    {
                        var writerUserType = userService.GetUserTypeByName("writer");
                        user = userService.CreateUserWithIdentity(email, email, writerUserType);
                    }

                    var identity = await userManager.FindByEmailAsync(email);
                    if (identity.Logins.All(x => x.ProviderKey != providerKey))
                    {
                        identity.Logins.Add(new IdentityUserLogin(issuer, providerKey, user.Id));
                        identity.Name = name;

                        var result = userManager.Update(identity);
                    }
                },
            }
        };

        adOptions.ForUmbracoBackOffice(style, icon);
        adOptions.Caption = caption;

        //Need to set the auth type as the issuer path
        adOptions.AuthenticationType = string.Format(
            CultureInfo.InvariantCulture,
            "https://sts.windows.net/{0}/",
            issuerId);

        adOptions.SetExternalSignInAutoLinkOptions(new ExternalSignInAutoLinkOptions(autoLinkExternalAccount: true));

        app.UseOpenIdConnectAuthentication(adOptions);
    }

0 个答案:

没有答案