Можно ли стилизовать страницу обратной передачи Windows Identity Foundation? - PullRequest
1 голос
/ 22 июля 2010

Можно ли стилизовать страницу обратной передачи Windows Identity Foundation?

Эта страница выглядит пустой после успешного входа в систему, и URL-адрес похож на https://sts.address.com/?wa=wsignin1.0&wtrealm=https....

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Я прочитал следующую статью, http://www.paraesthesia.com/archive/2011/01/31.aspx,, которая привела меня к использованию dotPeek в сборке Microsoft.IdentityModel. Что показывает мне, что все сообщение ProcessSignInResponse делает следующее:

 public static void ProcessSignInResponse(SignInResponseMessage signInResponseMessage, HttpResponse httpResponse)
    {
      if (signInResponseMessage == null)
        throw DiagnosticUtil.ExceptionUtil.ThrowHelperArgumentNull("signInResponseMessage");
      else if (httpResponse == null)
      {
        throw DiagnosticUtil.ExceptionUtil.ThrowHelperArgumentNull("httpResponse");
      }
      else
      {
        signInResponseMessage.Write(httpResponse.Output);
        httpResponse.Flush();
        httpResponse.End();
      }
    }

Метод signInResponseMessage.Write выполняет следующие действия:

public override void Write(TextWriter writer)
    {
      if (writer == null)
      {
        throw DiagnosticUtil.ExceptionUtil.ThrowHelperArgumentNull("writer");
      }
      else
      {
        this.Validate();
        writer.Write(this.WriteFormPost());
      }
    }

Как вы можете видеть, по сути, все, что выполняется, - это запись содержимого WriteFormPost в поток ответов.

Так что, как мы говорим, я изменяю свой метод "ProcessSignIn", чтобы он возвращал HTML для вывода вместо вызова FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse.

Итак, я существенно изменил свой метод из этого:

public static void ProcessSignIn(SignInRequestMessage signInRequest, HttpResponse httpResponse) 
    {
    FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse(signInResponseMessage, httpResponse);
    }

Кому:

public static string ProcessSignIn(SignInRequestMessage signInRequest) 
    {
    return signInResponseMessage.WriteFormPost();
    }

Конечно, SignInResponseMessage должен был обеспечить более чистый метод возврата только «основного» содержимого того, что вы хотите написать в сообщение формы, но получить Форма HTML в виде строки, по крайней мере, упрощает изменение результата перед его возвратом клиенту с помощью Response.Write(result).

1 голос
/ 28 июля 2010

Я не знаю, является ли это документированной функцией, но в качестве отправной точки я предложу следующее:

Если ваш код выглядит совсем как мой, у вас есть строка кодаэто выглядит так:

FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse(responseMessage, HttpContext.Current.Response)

Второй параметр ProcesssignInResponse является объектом HttpResponse.Я безуспешно пытался найти ответ на ваш вопрос, пытаясь передать настраиваемое сообщение HttpResponse, чтобы перехватить вывод, чтобы мы могли манипулировать им так, как вам нравится:передать myResponse в ProcessSignInResponse, выдается следующее исключение:

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.на System.Web.HttpResponse.End () в Microsoft.IdentityModel.Web.FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse (SignInResponseMessage signInResponseMessage, HttpResponse HTTPResponse) в Logon_App.LCLoginBase.issueTokenAndRedirect (logonParamsStruct & logonParams) в C: \ Вход App \ Logon App \ \ Кодекса LCLogin\ LCLoginBase.vb: строка xxx

...