FYI: см. Обновление 12-FEB-2019
Я создал приложение ASP.NET MVC (с помощью Visual Studio) и попытался заставить его обрабатывать единый вход с помощью федеративного сервера Active Directory.Обратите внимание, это , а не с использованием Azure.
Итак, первый шаг работает - я перехожу на свою страницу входа и есть кнопка, позволяющая мне войти в другой сервис ["Федерация"],При этом запускается веб-страница ADFS, где я ввожу свои учетные данные, но по возвращении на свой веб-сайт я получаю следующую ошибку:
IDX10214: проверка аудитории не выполнена.Аудитория: «[PII скрыт]».Не соответствует: validationParameters.ValidAudience: '[PII скрыт]' или validationParameters.ValidAudiences: '[PII скрыт]'.
Сведения об исключении: Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: Audience214,Аудитория: «[PII скрыт]».Не соответствует: validationParameters.ValidAudience: '[PII скрыт]' или validationParameters.ValidAudiences: '[PII скрыт]'.
Очевидно, я не настроил это правильно ..... так что нужно знать, что мне не хватает ...
Вот мой (урезанный) код:
Startup.Auth.cs
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
{
MetadataAddress = "https://adfs.Mydomain.com/FederationMetadata/2007-06/FederationMetadata.xml",
Wtrealm = "https://myWebServer/myWebApplication"
});
}
private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
{
return true; // Our "TEST" ADFS has a fake certficate, so we don't want to validate it.
}
}
Разделы в Web.Config
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="ClaimsNameIdentifier" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" />
<add key="ClaimsUPNIdentifier" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" />
<add key="ClaimsEmailIdentifier" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" />
</appSettings>
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.7.1" />
<httpRuntime targetFramework="4.7.1" />
</system.web>
(Примечание: в вышеприведенном элементе аутентификации intellisense дал мне «Federated» в качестве опции, но это приводит кошибка компиляции).
Одним из полезных ресурсов был alligatortek , но он не заполнил все части.Есть и другие ресурсы, которые кажутся близкими, но недостаточно конкретными.
ОБНОВЛЕНИЕ 12-ФЕВРАЛЬ-2019
Основываясь на комментариях ниже, мне посоветовали вместо этого следовать Сообщение Витторио Берточчи , в котором используется опция «Pre-Premesis» (это очень похоже на сообщение Робера Финча ).Результирующий код немного отличается (см. Ниже), но результат остается тем же.
Startup.Auth.cs
public partial class Startup
{
private static readonly string realm = ConfigurationManager.AppSettings["ida:Wtrealm"];
private static readonly string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"];
/// <summary>
/// Configures the authentication.
/// </summary>
/// <param name="app">The current application.</param>
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
ServicePointManager.ServerCertificateValidationCallback = this.ValidateServerCertificate;
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = Startup.realm,
MetadataAddress = Startup.adfsMetadata
});
}
private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
{
return true; // Skips certificate validation as using a temp certificate.
}
}
Разделы вWeb.Config
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="ida:ADFSMetadata" value="https://adfs.Mydomain.com/FederationMetadata/2007-06/FederationMetadata.xml" />
<add key="ida:Wtrealm" value="https://myWebServer/myWebApplication" />
</appSettings>