3

APIを設定しました。ユーザーが無効/欠落しているAPIキーを提供すると、Response.StatusCodeを401に設定しようとしていますが、何かがログインページにバウンスし続けます。それはAPIです...だから私はそれを望んでいません。コードが401のjsonエラーメッセージを送信したいと思います。

このサンプルAPIのURLは次のとおりです。/api/search/foo?apikey=12345&bar=hi+stack+overflow

私は何を間違えましたか?

ここにいくつかのサンプルコードがあります:-

// Do we have an Api Key that is legit?
if (!CheckAPIKey(context))
{
    json = JsonConvert.ExportToString("Invalid API key or no API key was provided.");
    context.Response.StatusCode = 401; // Not authorised.
}
else
{
    ... get json data ...
}

context.Response.Write(json);

また、これが役立つ場合は、web.configに次のものがあります...

<authentication mode="Forms">
    <forms loginUrl="~/Pages/Login.aspx" protection="Validation" timeout="1000000000" requireSSL="false" slidingExpiration="true" defaultUrl="Default.aspx">
    </forms>
</authentication>

何か案は?

4

3 に答える 3

3

Globals.asax の Application_EndRequest で 401 を処理してみてください。フォーム認証モードが設定されているため、401 ステータス コードで Login.aspx ページにリダイレクトするという本来の動作が行われます。

コードは次のようになります。

HttpContext context = HttpContext.Current;
// Do we have an Api Key that is legit?
if (!CheckAPIKey(context))
{
    context.Response.StatusCode = 401; // Not authorised.
}
else
{
    ... get json data ...
}
context.Response.Write(json);

そして、Application_EndRequest では次のようになります。

protected void Application_EndRequest(object sender, EventArgs e)
{
    HttpContext context = HttpContext.Current;
    if (Response.StatusCode == 401)
    {
        Response.ClearContent();
        json = JsonConvert.ExportToString("Invalid API key or no API key was provided.");
        context.Response.Write(json);
    }
}
于 2010-01-08T18:34:48.523 に答える
1

ASP.NETは「401Notauthorized」ステータスを処理し、ユーザーをログインページにバウンスするため、サーバーからの401メッセージを処理する方法です。

代わりに「403Forbidden」に設定してみてください。ただし、ASP.NETはそれらをログインハンドラーにも送信する傾向があると思います(これは少し面倒です)、または単なる「400BadRequest」です。

于 2009-08-17T10:32:44.757 に答える
0

この動作は、使用しているSystem.Web.Security.FormsAuthenticationModuleによって異なります(正しく覚えていれば、デフォルトでアクティブになっています)。AuthenticateRequestイベントだけでなく、HTTPコード401を探すEndRequestイベントも監視します。これは、他のモジュール(System.Web.Security.UrlAuthorizationModuleなど)が「評価」を通知する方法です。

URLがAPIの場合、おそらく

<location />

web.configの要素を使用して、構成を微調整します。HTH

編集:もっと何か...

私の提案があなたに役立つかどうかはわかりません:-)たぶんZhaph-BenDuguidのアイデアの方が優れています。

ともかく...

これがロケーションElementのリファレンスです。つまり、特定のパスに対して異なる構成のセットを決定できます。完全に同等ではない別の方法があります。.configファイルの階層的な性質を利用することです。

あなたのAPIはより大きなウェブアプリケーションの一部だと思いました...

あなたの場合、URL / api / search / foo(あなたの例では)に対して、異なる振る舞いが必要かどうかを評価する必要があります。別のものが必要な場合は、「場所」のリファレンスを参照して、何かをオフにできるかどうかを調べてみてください。

アプリケーションが「単なる」APIである場合は、不要なすべてのモジュール(特に、リダイレクトを担当するFormsAuthenticationModule)を削除できます。

于 2009-08-17T10:47:19.407 に答える