Ошибка - сообщение SignInResponse может перенаправлять только в текущем веб-приложении - приложение MVC 2.0 - PullRequest
35 голосов
/ 16 декабря 2010

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

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

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

    <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. У меня есть косая черта в области и аудитории.
  2. Я добавил то, что он предложил, в Application_BeginRequest - затем я скопировал код в [домен разработки], как тот, где находятся сертификаты. Тогда он просто застревает в бесконечном цикле.
  3. Я также проверил свою проверяющую сторону на сервере в Женеве. Идентификаторы и конечные точки (POST) оба являются https://[development доменом] / [приложение] / - снова с завершающей косой чертой

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

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

J

Ответы [ 5 ]

35 голосов
/ 10 марта 2012

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

http://localhost/myapp/

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

http://localhost/myapp

не будет.

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

17 голосов
/ 05 ноября 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);
    }
}
10 голосов
/ 26 октября 2012

Этот код позаботится об этом (поместите его в 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.Проверьте правильность имени эмитента и области.

5 голосов
/ 07 марта 2013

Я использую проверку подлинности с помощью форм с WIF.Модуль auth форм перенаправляет неавторизованные запросы на правильный контроллер и сохраняет первоначально запрошенный 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" />
2 голосов
/ 05 октября 2012

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

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

...