Подтвердить что ты не робот

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

Я думаю, что это проблема с тем, что это приложение MVC, я создал множество сайтов Claims Aware и получил мои претензии и т.д. на странице default.aspx. Мое мышление заключается в том, что маршрутизация, связанная с приложением MVC, каким-то образом вывешивает ее неправильно?

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

J

4b9b3361

Ответ 1

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

http://localhost/myapp/

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

http://localhost/myapp

не будет.

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

Ответ 2

Я переопределяю RedirectToIdentityProvider в подклассе WSFederationAuthenticationModule. Это происходит только один раз перед перенаправлением на STS. Вы должны указать конфигурационному файлу использовать этот класс FixedWSFederationAuthenticationModule вместо defualt 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);
    }
}

Ответ 3

Этот код позаботится об этом (поместите его в 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 + "/");
}

EDIT:

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

Ответ 4

Я использую проверку подлинности с помощью 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" />

Ответ 5

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

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