是否可以设置Windows Identity Foundation回发页面的样式?

时间:2010-07-21 21:42:20

标签: asp.net wif

是否可以设置Windows Identity Foundation回发页面的样式?

这是您成功登录后显示为空白的页面,其网址类似于https://sts.address.com/?wa=wsignin1.0&wtrealm=https....

2 个答案:

答案 0 :(得分:2)

我阅读了以下文章http://www.paraesthesia.com/archive/2011/01/31.aspx,这使我在Microsoft.IdentityModel程序集上使用了dotPeek。这向我显示所有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 :(得分:1)

我不知道这是否是一个记录的功能,但我会建议以下作为起点:

如果您的代码看起来像我的一样,那么您有一行代码如下:

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

ProcesssignInResponse的第二个参数是HttpResponse对象。我试图通过传递自定义的HttpResponse消息来捕获输出,但尝试传递一个问题的答案,但我没有成功找到你的问题的答案,所以我们可以随意操纵它:

Dim myStringbuilder As New StringBuilder
Dim myStringWriter As New IO.StringWriter(myStringbuilder)
Dim myResponse As New Web.HttpResponse(myStringWriter)

如果您将myResponse传递给ProcessSignInResponse,则会引发以下异常:

  

System.NullReferenceException:未将对象引用设置为对象的实例。      在System.Web.HttpResponse.End()      在Microsoft.IdentityModel.Web.FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse(SignInResponseMessage signInResponseMessage,HttpResponse httpResponse)      在C:\ Logon App \ Logon App \ Code \ LCLogin \ LCLoginBase.vb中的Logon_App.LCLoginBase.issueTokenAndRedirect(logonParamsStruct& logonParams):行xxx