Моих ASP.Net приложение использует Owin/Катану/Требования и позволяет вход с помощью:Owin Challenge() метод не выполняется при использовании несколько ADFS + Cookies
- Традиционного имени пользователя/пароля (существует для всех пользователей)
- Azure AD
Он отлично работает, и все необходимые редиректы/утверждает, переводы работают хорошо (пользователь NameIdentifier/услуг (/ арендатора) детали передаются обратно в мое приложение, так уникальных значений идентификаторов могут быть связаны). Обратите внимание, что пользователи не регистрируются/регистрируются для приложения - доступ предоставляется суперпользователем их организации, а также имя пользователя/пароль, отправленные им, которые затем могут подключаться к Google/Azure.
Однако теперь мне нужно расширить эту функциональность, чтобы пользователи могли подключиться к провайдеру ADFS своей организации. Единственный рабочий пример для этого, который удаленно закрыт, находится здесь (tutorial/code), но он строго основан только на ADFS. Когда я адаптирую это в свой проект, он не работает.
Весь мой файл StartupAuth показан ниже. Я ценю, что могут быть ошибки конфигурации, но на основе отрывков образцов, которые я нашел за последние шесть недель, это лучшее, что у меня было.
public void Configuration(IAppBuilder app)
{
// STANDARD CODE FOR APP COOKIE AND GOOGLE - WORKS PERFECTLY
CookieAuthenticationOptions coa = new CookieAuthenticationOptions {
AuthenticationMode = AuthenticationMode.Active,
CookieName = "MyAppName",
ExpireTimeSpan = TimeSpan.FromMinutes(60),
SlidingExpiration = true,
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/login.aspx"),
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.SameAsRequest,
Provider = new CookieAuthenticationProvider { OnValidateIdentity = context =>
{
dynamic ret = Task.Run(() =>
{
// Verify that "userId" and "customerId" claims exist, and that each has a valid value (greater than zero) - removed for brevity
return Task.FromResult(0);
});
return ret;
} }
};
app.SetDefaultSignInAsAuthenticationType(coa.AuthenticationType);
app.UseCookieAuthentication(coa);
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions {
ClientId = "84***********************k3.apps.googleusercontent.com",
ClientSecret = "jue*****************Ppi"
});
// NEW CODE THAT FAILS TO WORK - SPECIFYING EACH CUSTOMER'S ADFS AS A NEW WSFED AUTH OPTION
WsFederation.WsFederationAuthenticationOptions Adfs_CompanyA = new WsFederation.WsFederationAuthenticationOptions {
AuthenticationMode = AuthenticationMode.Passive,
MetadataAddress = "https://CompanyA.net/FederationMetadata/2007-06/FederationMetadata.xml",
AuthenticationType = AdfsAuthenticationTypes.CompanyA,
Wtrealm = "https://www.CompanyA.co.uk/MyAppName"
};
WsFederation.WsFederationAuthenticationOptions Adfs_CompanyB = new WsFederation.WsFederationAuthenticationOptions {
AuthenticationMode = AuthenticationMode.Passive,
MetadataAddress = "https://CompanyB.net/federationmetadata/2007-06/federationmetadata.xml",
AuthenticationType = AdfsAuthenticationTypes.CompanyB,
Wtrealm = "http://www.CompanyB.co.uk/azure/MyAppName"
};
// User (who is logged in), route for hyperlink "Link my account with ADFS"
app.Map("/SSO/LinkUserAccount/ADFS/process", configuration => { configuration.UseWsFederationAuthentication(Adfs_CompanyA); });
// CompanyA ADFS - single sign-on route
app.Map("/SSO/Login/CompanyA/ADFS/Go", configuration => { configuration.UseWsFederationAuthentication(Adfs_CompanyA); });
// CompanyB ADFS - single sign-on route
app.Map("/SSO/Login/CompanyB/ADFS/Go", configuration => { configuration.UseWsFederationAuthentication(Adfs_CompanyB); });
}
}
Вот код, я использую, чтобы выпустить Owin вызов:
string provider = MyApp.SingleSignOn.GetCustomerAdfsAuthenticationType(customerName);
string redirectUrl = string.Format("{0}/SSO/Login/{1}/ADFS/Go", Request.Url.GetLeftPart(UriPartial.Authority), provider); // creates https://myapp.com/SSO/Login/CompanyA/ADFS/Go for CompanyA users
Context.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = redirectUrl }, provider);
Response.StatusCode = 401;
Response.End();
Это WebForms, но, пожалуйста, не позволяйте, что остановить MVC про от содействия. В любом случае, код практически идентичен, и я использую маршруты.
Проблема заключается в том, что когда пользователь нажимает ссылку «Вход в систему с ADFS», например. URL становится https://myapp.com/SSO/Login/CompanyA/ADFS Я получаю ошибку 401 Unauthorized, вместо того, чтобы пользователь перенаправлялся на страницу входа в ADFS.
В web.config я разрешаю несанкционированный доступ к пути «SSO». По какой-то причине метод Challenge()
никогда не перенаправляет пользователя, он просто игнорируется и код достигает точки, где он возвращает 401. Значение строки provider
точно соответствует значению WsFederationAuthenticationOptions.AuthenticationType
, определенному в Startup.Auth.
Я уже шесть недель обманываю это, так что это дает щедрость при первой возможности, и ящик пива доставлен по выбранному вами адресу, когда он будет разрешен.
Пример кода появляется, чтобы создать один экземпляр ADFS, который что-то я сталкивался во многих других проектах в Интернете. Однако я не вижу никакого использования ADFS в тандеме с другими провайдерами. Сегодня я посмотрю на регистрацию, хотя это не то, что я делал раньше. – EvilDr
IdentityServer 3 поддерживает социальные (Google и т. Д.) OpenID Connect, OAuth2 и WS-Fed – nzpcmad