OpenIdConnectAuthenticationOptions устанавливает программный идентификатор клиента на основе E-Mail / домена пользователя. - PullRequest
0 голосов
/ 30 января 2020

У меня есть существующий веб-сайт publi c, написанный на MVC 4, который использует проверку подлинности с помощью форм и настроил учетные записи пользователей в БД SQL. У меня есть краткое описание, чтобы добавить функциональность единой регистрации, которую я получил, работая таким образом. В нашей SQL будет создана учетная запись пользователя, в которой адрес электронной почты будет совпадать с именем входа в активный каталог. В настоящее время это работает, я могу зайти в свое приложение и оно автоматически войдет в систему.

Я настроил регистрацию приложения в azure активной директории, которая предоставила мне идентификатор клиента и ключ приложения для использования. Это все хорошо, но, поскольку в настоящее время настроено, это ограничивает меня разрешением только одному клиенту подписаться на наш сервис с помощью единого входа. Я хотел бы настроить таблицу, в которой будут храниться домен, идентификатор клиента и ключ приложения, чтобы при посещении сайта посетителем мы могли «обнаружить» его домен или электронную почту и таким образом найти идентификатор клиента и приложение. ключ для использования в их активном каталоге. Это общедоступный c веб-сайт, и он ДОЛЖЕН продолжать поддерживать стандартную регистрацию аутентификации форм И разрешать организациям получать к нему доступ, используя свои существующие учетные данные для входа в свою AD.

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

Я ЛЮБЛЮ некоторую помощь прямо сейчас. Для справки я использую Startup.Auth.cs, который любезно сгенерировал Visual Studio для обработки рукопожатия. Ниже приведен соответствующий код с примечаниями и изменениями.

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseCookieAuthentication(new CookieAuthenticationOptions { });
            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = clientId, <--------- HERE THE CLIENT ID IS SET FROM A VARIABLE HARD CODED ABOVE
                    Authority = authority,
                    TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                    {
                        // instead of using the default validation (validating against a single issuer value, as we do in line of business apps), 
                        // we inject our own multitenant validation logic
                        ValidateIssuer = false,
                    },
                    Notifications = new OpenIdConnectAuthenticationNotifications()
                    {
                        SecurityTokenValidated = (context) =>
                        {
                            return Task.FromResult(0);
                        },
                        AuthorizationCodeReceived = (context) =>
                        {
                            var code = context.Code;
                            var email = context.JwtSecurityToken.Claims.First(x => x.Type == "unique_name").Value;                            

                            ###################################################################
                            HERE I HAVE GOT THE E-MAIL SO I AM ABLE TO FIND THE DOMAIN AND FIND THE 
                            CLIENT ID I NEED, BUT I NEED TO FIND THIS BEFORE THE LINE
                            app.UseOpenIdConnectAuthentication WHERE WE USE THE CLIENT ID
                            ###################################################################
                            string[] EMailAddress = email.Split('@');
                            CallResponse callResponse = BusinessObjectSSO.SSO_GetApplicationDetailsByDomain(EMailAddress[1]);
                            if (callResponse.ResponseCode == 0)
                            {
                                DomainApplication domainApplication = (DomainApplication)callResponse.ReturnData;
                                clientId = domainApplication.ClientID;
                                appKey = domainApplication.Secret;
                            }

                            ClientCredential credential = new ClientCredential(clientId, appKey);
                            string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
                            string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;

                            AuthenticationContext authContext = new AuthenticationContext(aadInstance + tenantID, new ADALTokenCache(signedInUserID));
                            AuthenticationResult result = authContext.AcquireTokenByAuthorizationCodeAsync(code, new Uri("http://localhost:51437/"), credential, graphResourceID).Result;
                            SessionClass.SSOEMail = result.UserInfo.DisplayableId;

                            CallResponse callResponseUser = BusinessObjectSSO.SSO_AssignUserIDFromEMailAddress(signedInUserID, result.UserInfo.DisplayableId);
                            SessionClass.SSOUserID = Convert.ToInt32(callResponseUser.ReturnData);

                            return Task.FromResult(0);
                        },
                        AuthenticationFailed = (context) =>
                        {
                            context.OwinContext.Response.Redirect("Account/Error");
                            context.HandleResponse(); // Suppress the exception
                            return Task.FromResult(0);
                        }
                    }
                });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...