Azure AD Auto, выход из системы после входа - PullRequest
1 голос
/ 24 мая 2019

Итак, я просмотрел столько постов, сколько смогу, и, похоже, я не могу с этим разобраться!

Мой клиент хочет, чтобы мы разрешили входить в их ADFS через построенную мной платформу MVC, поэтому яя пытаюсь разрешить им входить в свою Azure AD для входа в платформу.

Когда я перенаправлен на свою страницу входа в Azure AD (вход в MS), я ввожу свои учетные данные, и затем это выглядит таквыполняет цикл быстрого перенаправления, а затем автоматически выписывает меня, я схожу с ума !!!

Ниже приведено все, что я настроил:

В Azure AD:

On Startup.Auth.cs

public partial class Startup
    {

        // Calling the keys values from Web.config file  
        private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
        private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
        private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
        private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];

        // Concatenate aadInstance, tenant to form authority value       
        private string authority = string.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

        // ConfigureAuth method  
        public void ConfigureAuth(IAppBuilder app)
        {
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            //app.UseCookieAuthentication(new CookieAuthenticationOptions());

            //Enable the application to use a cookie to store information for the signed in user

            //and to use a cookie to temporarily store information about a user logging in with a third party login provider

            //Configure the sign in cookie

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });

            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseCookieAuthentication(new CookieAuthenticationOptions());

            app.UseOpenIdConnectAuthentication(

                            new OpenIdConnectAuthenticationOptions
                            {
                                ClientId = clientId,
                                Authority = authority,
                                PostLogoutRedirectUri = postLogoutRedirectUri,
                                Notifications = new OpenIdConnectAuthenticationNotifications
                                {
                                    AuthenticationFailed = (context) =>
                                    {
                                        context.HandleResponse();
                                        context.OwinContext.Response.Redirect("/Home/Index");
                                        return Task.FromResult(0);
                                    }
                                }
                            });


        } // end - ConfigureAuth method  

На моем routeConfig: Это было сделано для того, чтобы мойПользовательская целевая страница может быть загружена первой, на этой странице есть кнопка с надписью «Войти на платформу», по которой клиент будет нажимать и переходить на подписку Azure AD.nin (Страница входа в MS)

public static class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.LowercaseUrls = true;
            routes.MapRoute("Default", "{controller}/{action}/{id}", new
            {
                controller = "Account",
                action = "Login",
                id = UrlParameter.Optional
            }).RouteHandler = new DashRouteHandler();
        }
    }

Контроллер учетных записей

[Authorize]
        public void SignIn()
        {
            clsHomeScreen clsHomeScreen = new clsHomeScreen();
            if (!Request.IsAuthenticated)
            {
                HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
            }

            Response.Redirect("/");
        }

[AllowAnonymous]
        [OutputCache(NoStore = true, Location = OutputCacheLocation.None)]
        public ActionResult Login(string returnUrl)
        {
            // We do not want to use any existing identity information
            EnsureLoggedOut();

            // Store the originating URL so we can attach it to a form field
            var viewModel = new AccountLoginModel { ReturnUrl = returnUrl };

            return View(viewModel);
        }

HomeController - это место, куда СЛЕДУЕТ перенаправлять после входа в систему, но это не так:

[Authorize]
        public async Task<ActionResult> Index()
        {
            HomeScreenLists HS = new HomeScreenLists();
            IEnumerable<Challenges> ActiveChallenges;
            IEnumerable<Challenges> PrivateChallenges;
            string loggedInUserId = "";
            string loggedInEmail = "";
            var userClaims = User.Identity as System.Security.Claims.ClaimsIdentity;

            string email = userClaims?.FindFirst(System.IdentityModel.Claims.ClaimTypes.Name)?.Value;
            string firstname = userClaims?.FindFirst(System.IdentityModel.Claims.ClaimTypes.GivenName)?.Value;
            string lastname = userClaims?.FindFirst(System.IdentityModel.Claims.ClaimTypes.Surname)?.Value;
            string userId = "";

            //The Email will not contain an @(i.e. an email address) if not using Azure AD to sign in.
            if (!email.Contains("@"))
            {
                loggedInUserId = User.Identity.GetUserId();
                goto LoggedInUser_Found;
            }

            if (TempData["LoggedInEmail"] != null)
            {
                if (email != TempData["LoggedInEmail"].ToString())
                {
                    userId = clsHomeScreen.GetUserId(TempData["LoggedInEmail"].ToString());
                }
                else
                {
                    userId = clsHomeScreen.GetUserId(email);
                }
            }

            if (email != null)
            {
                userId = clsHomeScreen.GetUserId(email);
            }

            if (userId == null || userId == "")
            {
                clsUsers clsUsers = new clsUsers();

                if (TempData["LoggedInEmail"] != null)
                {
                    loggedInEmail = TempData["LoggedInEmail"].ToString();

                    var userDetails = clsUsers.GetUsers().Where(x => x.Email == loggedInEmail).FirstOrDefault();
                    loggedInUserId = userDetails.Id;
                }
                else
                {
                    if(userId == null)
                    {
                        await RegisterAAD();
                        userId = clsHomeScreen.GetUserId(email);
                        loggedInUserId = userId;
                    }
                    else
                    {
                        loggedInUserId = User.Identity.GetUserId();
                    }

                }
            }
            else
            {
                loggedInUserId = userId;
            }

            LoggedInUser_Found:

            int iBU = (int)db.Users.FirstOrDefault(x => x.Id == loggedInUserId).fkiBusinessUnitId;

            if (iBU == 0)
            {
                HS.HasBU = false;
                TempData["HasBU"] = "No";
                TempData["UserId"] = loggedInUserId;
            }
            else
            {
                HS.HasBU = true;
                TempData["HasBU"] = "Yes";
                TempData["UserId"] = loggedInUserId;
            }

            bool isAdmin = false;

            if (User.IsInRole("Administrator"))
            {
                isAdmin = true;
            }

            ActiveChallenges = clsChallenges.GetActiveChallenges();
            PrivateChallenges = clsChallenges.GetPrivateChallenges(loggedInUserId, isAdmin);

            HS.HomeScreenList = clsHomeScreen.GetHomeScreenAdverts();

            HS.ActiveChallengesList = ActiveChallenges;
            HS.PrivateChallengesList = PrivateChallenges;

            HS.UserId = loggedInUserId;

            return View(HS);
        }

Поэтому, если я удаляю атрибут [Authorize] в Index ActionResult, он выполняет непрерывный цикл перенаправления.

Что я пытался:

  • Я пытался использовать KentorCookiSaver, который не работал.
  • Воссоздание службы приложения
  • Изменен redirectUrl вРегистрация приложения Azure AD
  • Кто-то даже говорил о перезаписи файлов cookie, которые я пробовал, но не знаю, правильно ли я выполнил действия, ссылка Здесь

Я пробовал так много вещей, что даже не помню, что пытался.Может кто-нибудь помочь с тем, что я делаю неправильно, пожалуйста.

Спасибо миллион!

1 Ответ

0 голосов
/ 24 мая 2019

Итак, с некоторой помощью кого-то, кто знает эти вещи, моя проблема была решена.

В конечном итоге все получилось:

  • Мне нужно было добавить RedirectUri в мой Web.config и в мой Startup.Auth

Web.Config

<add key="ida:RedirectUri" value="https://sitename.azurewebsites.net/Home/Index"/>

Startup.Auth

 app.UseOpenIdConnectAuthentication(

                            new OpenIdConnectAuthenticationOptions
                            {
                                ClientId = clientId,
                                Authority = authority,
                                RedirectUri = redirectUri,
                                PostLogoutRedirectUri = postLogoutRedirectUri,
                                Notifications = new OpenIdConnectAuthenticationNotifications
                                {
                                    AuthenticationFailed = (context) =>
                                    {
                                        context.HandleResponse();
                                        context.OwinContext.Response.Redirect("/Home/Index");
                                        return Task.FromResult(0);
                                    }
                                }
                            });
  • Мой процесс входа продолжал перенаправляться обратно на мою учетную запись / страницу входа в систему при сбое, когда он должен был быть направлен на мою домашнюю страницу / индекс, поскольку я использовал свою учетную запись / имя входа в качестве целевой страницы, и аутентификация происходила только после этого, проблема это произошло из-за того, что я сделал «EnsureLogOut» в учетной записи / логине, поэтому он продолжал выходить из системы, прежде чем захотел пройти аутентификацию. Поэтому вместо Redirect = "/" я изменил следующее:

public void SignIn()

    `{`

        `clsHomeScreen clsHomeScreen = new clsHomeScreen();`

        `if (!Request.IsAuthenticated)`

        `{`

            `HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/Home/Index" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);`

        `}`


        `Response.Redirect("/Home/Index");`

    `}`

Возможно, это то, что может не помочь другим, но, возможно, это поможет им в правильном направлении.

...