У меня есть существующий веб-сайт 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);
}
}
});