Ошибка - сообщение SignInResponse может выполнять перенаправление только в текущем веб-приложении - приложение MVC 2.0

У меня есть ситуация, когда у нас есть приложение MVC 2 (я пробовал это с базовым приложением MVC 2 без каких-либо дополнительных вещей, все еще та же проблема) и я использую adfs 2 для аутентификации моих пользователей.

Итак ... Теперь я вхожу в свое приложение и получаю следующее: ID3206: сообщение SignInResponse может выполнять перенаправление только в текущем веб-приложении: '/ [app]' не разрешено. Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде. Сведения об исключении: Microsoft.IdentityModel.Protocols.FederationException: ID3206: сообщение SignInResponse может выполнять перенаправление только в текущем веб-приложении: '/ [app]' не разрешено.

Я прочитал большинство блогов по этому поводу и отправил в один ..

    <federatedAuthentication>
            <wsFederation passiveRedirectEnabled="true" issuer="https://auth.[domain]/adfs/ls/" realm="https://[development domain]/[app]/" requireHttps="true" />
            <cookieHandler requireSsl="true" />
          </federatedAuthentication>
<audienceUris>
    <add value="https://[development domain]/[app]/" />
  </audienceUris>
  1. У меня есть завершающий слэш на области и аудиторииUris.
  2. Я добавил то, что он предложил, в Application_BeginRequest - затем я скопировал код в [домен разработки], поскольку там находятся сертификаты ... Тогда он просто застревает в бесконечном цикле.
  3. Я также проверил свою Проверяющую сторону на сервере в Женеве. Идентификаторы и конечные точки (POST) - это https: // [домен разработки] / [приложение] / - снова с косой чертой в конце

Я думаю, проблема в том, что это приложение MVC. Я создал множество веб-сайтов с информацией о претензиях и получил свои претензии и т. Д. На странице default.aspx. Я думаю, что маршрутизация, связанная с приложением MVC, каким-то образом отправляет его обратно неправильно?

любая помощь действительно необходима, так как я смотрю на это в течение некоторого времени безрезультатно ..

J


person John    schedule 16.12.2010    source источник
comment
У меня такая же проблема с MVC4.   -  person SGarratt    schedule 28.11.2012


Ответы (5)


Я рвал на этом волосы. В моей конфигурации тоже указана конечная косая черта. Оказывается, в моем случае, переход к моему приложению с косой чертой в конце в браузере, вот так:

http://localhost/myapp/

будет работать, тогда как

http://localhost/myapp

не буду.

Если я смогу найти еще несколько причин, почему это так, я добавлю еще немного истории о том, почему это происходит.

person Dave Markle    schedule 10.03.2012

Я отменяю RedirectToIdentityProvider в подклассе WSFederationAuthenticationModule. Это происходит только один раз перед перенаправлением на STS. Вы должны указать конфигурационному файлу использовать этот класс FixedWSFederationAuthenticationModule вместо значения по умолчанию WSFederationAuthenticationModule

public class FixedWSFederationAuthenticationModule : WSFederationAuthenticationModule
{
    public override void RedirectToIdentityProvider(string uniqueId, string returnUrl, bool persist)
    {
        //This corrects WIF error ID3206 "A SignInResponse message may only redirect within the current web application:"
        //First Check if the request url doesn't end with a "/"
        if (!returnUrl.EndsWith("/"))
        {
            //Compare if Request Url +"/" is equal to the Realm, so only root access is corrected
            //https://localhost/AppName plus "/" is equal to https://localhost/AppName/
            //This is to avoid MVC urls
            if (String.Compare(System.Web.HttpContext.Current.Request.Url.AbsoluteUri + "/", base.Realm, StringComparison.InvariantCultureIgnoreCase) == 0)
            {
                //Add the trailing slash
                returnUrl += "/";
            }
        }
        base.RedirectToIdentityProvider(uniqueId, returnUrl, persist);
    }
}
person user1496129    schedule 05.11.2012
comment
Вот синтаксис вашего web.config: ‹add name = FixedWSFederationAuthenticationModule type = MyNamespace.STSHelper.FixedWSFederationAuthenticationModule, MyNamespace preCondition = managedHandler /› - person ADH; 11.10.2013
comment
Есть ли причина для создания подкласса вместо того, чтобы помещать WSFederationAuthenticationModule_RedirectingToIdentityProvider? RedirectingToIdentityProviderEventArgs позволяет вам изменять SignInRequestMessage, насколько я могу судить. - person ta.speot.is; 23.09.2014
comment
Этот код завершится ошибкой, если URL-адрес запроса содержит параметры и / или если область не является подмножеством URL-адреса запроса или не идентична ему. Оба этих сценария вполне возможны. - person Joergen Bech; 04.12.2014

Этот код позаботится об этом (поместите его в global.asax):

private void Application_BeginRequest(object sender, EventArgs e)
{
//  This corrects WIF error ID3206 "A SignInResponse message may only redirect within the current web application: '/NHP' is not allowed."
//  For whatever reason, accessing the site without a trailing slash causes this error.
if (String.Compare(Request.Path, Request.ApplicationPath, StringComparison.InvariantCultureIgnoreCase) == 0 && !(Request.Path.EndsWith("/")))
Response.Redirect(Request.Path + "/");
}

РЕДАКТИРОВАТЬ:

Еще одна вещь, которую нужно проверить, - это элемент federationAuthentication / wsFederation в вашем microsoft.identityModel в Web.config. Убедитесь, что эмитент и область указаны правильно.

person Mike Cheel    schedule 26.10.2012
comment
При таком подходе я получил несколько странных бесконечных перенаправлений между IP-STS и RP при входе в систему. - person Vladislav; 05.08.2014
comment
Я думаю, что тогда происходит что-то еще, но я не могу вам сказать, что именно. - person Mike Cheel; 05.08.2014
comment
Это сработало для нас, и его было проще всего реализовать. Наша ситуация заключалась в том, что у нас есть несколько виртуальных приложений на одном веб-сайте, поэтому каждое в качестве страницы входа в своей собственной «папке», и вышесказанное устранило проблему. - person Action Dan; 11.05.2016

Я использую проверку подлинности с помощью форм с WIF. Модуль авторизации форм перенаправляет неавторизованные запросы на правильный контроллер и сохраняет первоначально запрошенный URL-адрес в параметре ReturnUrl, поэтому я решил эту ошибку, переопределив метод GetReturnUrlFromResponse.

/// <summary>
/// Provides a workaround for a bug in the standard authentication module.
/// </summary>
/// <remarks>
/// This class corrects WIF error ID3206 "A SignInResponse message may only
/// redirect within the current web application..."
/// WSFAM produces the error when the ReturnUrl is the root of the web application,
/// but doesn't have a trailing slash. For instance, "/app" is considered incorrect
/// by WSFAM whereas "/app/" is correct.
/// </remarks>
public class FixedWsFederationAuthenticationModule : System.IdentityModel.Services.WSFederationAuthenticationModule
{
    /// <summary>
    /// Extracts the URL of the page that was originally requested from
    /// the sign-in response.
    /// </summary>
    /// <returns>
    /// The URL of the page that was originally requested by the client.
    /// This is the URL (at the relying party) to which the client should
    /// be redirected following successful sign-in.
    /// </returns>
    /// <param name="request">
    /// The HTTP request that contains a form POST, which contains the
    /// WS-Federation sign-in response message.
    /// </param>
    protected override string GetReturnUrlFromResponse(HttpRequestBase request)
    {
        string returnUrl = base.GetReturnUrlFromResponse(request);

        // First Check if the request url doesn't end with a "/"
        if (!string.IsNullOrEmpty(returnUrl) && !returnUrl.EndsWith("/"))
        {
            // Compare if (return Url +"/") is equal to the Realm path,
            // so only root access is corrected.
            // /AppName plus "/" is equal to /AppName/
            // This is to avoid MVC urls.
            if (string.Compare(
                returnUrl + "/",
                new Uri(Realm).LocalPath,
                StringComparison.InvariantCultureIgnoreCase) == 0)
            {
                // Add the trailing slash.
                returnUrl += "/";
            }
        }

        return returnUrl;
    }
}

Чтобы использовать этот класс, вам необходимо зарегистрировать его в web.config. Добавьте этот элемент в раздел system.webServer/modules, изменив соответствующие части:

<add name="WSFederationAuthenticationModule" type="YOUR_NAMESPACE.FixedWsFederationAuthenticationModule, YOUR_ASSEMBLY" preCondition="managedHandler" />
person Gebb    schedule 07.03.2013

У меня возникла эта проблема, когда я добавил ссылку STS в свое веб-приложение, которое по умолчанию работает на виртуальном сервере на динамическом порту. Я изменил его, чтобы запустить его из IIS (как и в случае с виртуальным веб-сервером, перенаправление на STS не произойдет, если вы не запустите его из IIS / IIS Express) и вручную отредактировал web.config для изменения URI аудитории в конфигурации Microsoft.IdentityModel.

Когда я посмотрел на FederationMetadata.xml, он все еще относился к старому местоположению (с динамическим портом). Я обновил свой справочник STS, добавив его снова, и он сработал.

person Badal    schedule 05.10.2012