2

ASP.Net MVC でリダイレクトはどのように機能しますか?

私は、Scott Henselman のブログから、DotNetOpenId を使用して OpenID 経由でログインするコードをコピーして変更しました。デバッグ中、このコード セグメントを実行すると、次のことがわかります。

// Stage 2: user submitting Identifier
var openId = Request.Form["openId"];
new OpenIdRelyingParty().CreateRequest(openId).RedirectToProvider();
throw new Exception("Should never get here");

throw 句に到達することはありませんが、リダイレクトを続行します。それはどのように機能しますか?

次に、OpenId プロバイダーからの応答を取得したら、次のコード セグメントを使用してデバッグします。

switch (response.Status)
{
  case AuthenticationStatus.Authenticated:
    FormsAuthentication.RedirectFromLoginPage(response.ClaimedIdentifier, false);
    // am I supposed to reach this line? What should I return here?
    // (The method expects a View to be returned)

そして、 FormsAuthentication.RedirectFromLoginPage() への呼び出しが返され、アクションから何かを返す必要があることがわかりました。ここには何を返せばいいですか?

4

1 に答える 1

2

最初の例では、RedirectToProvider()メソッドは ASP.NETResponse.Redirect()メソッドを呼び出します。このメソッドは、ASP.NET 自体によって実装されているため、例外をスローします(ThreadAbortException具体的には)。そのため、列に並ぶことはありませんthrow new Exception("Should never get here");。ただし、到達することはありませんが、メソッドが検証可能で安全なコードであるためにステートメントが必要 throwないことを C# が認識できるため、表示する必要があることに注意してください。return

このFormsAuthentication.RedirectFromLoginPageメソッドは最終的に も呼び出しますResponse.Redirect。つまり、例外もスローされます。ただし、その下にステートメントがないためthrow、C# では代わりに何かを返す必要があります。戻り値の型を持つメソッドを使用している場合、C# では、考えられるすべての出口点で return または throw する必要があります。

ASP.NET Web フォームでResponse.Redirectは、これが唯一の選択肢でした (そうではありませんが、そのように見えました)。しかし、ASP.NET MVC は、例外をスローすることなくブラウザー リダイレクトを発行できる RedirectAction を提供します。DotNetOpenAuth (DotNetOpenId の後継) は、この機能を活用する方法を提供します。

ここに示すようIAuthenticationRequest.RedirectingResponse.AsActionResult()に、 を呼び出す代わりに、コントローラーのアクションからログインを開始するための結果を返すことで、プロバイダーにリダイレクトできますIAuthenticationRequest.RedirectToProvider()

FormsAuthentication.RedirectFromLoginPageまた、呼び出しFormsAuthentication.SetAuthCookieを使用せずにユーザーをサイトにログインさせreturn Redirect(...)、コントローラーのアクション内でユーザーを目的地に送信することもできます。

于 2010-01-02T20:41:29.953 に答える