当我将ASP.NET HTTP状态码硬编码为401时,我会一直跳转到登录页面?

当我将ASP.NET HTTP状态码硬编码为401时,我会一直跳转到登录页面?,asp.net,json,api,http-status-codes,Asp.net,Json,Api,Http Status Codes,我有一个API设置。当用户提供一个无效/丢失的API密钥时,我试图将Response.StatusCode设置为401,有东西不断地将我跳转到我的登录页面。这是一个API。。。所以我不想那样。我希望向他们发送json错误消息,代码为401 此示例api的url为:/api/search/foo?apikey=12345&bar=hi+stack+overflow 我做错了什么 下面是一些示例代码:- // Do we have an Api Key that is legit? if (!Che

我有一个API设置。当用户提供一个无效/丢失的API密钥时,我试图将Response.StatusCode设置为401,有东西不断地将我跳转到我的登录页面。这是一个API。。。所以我不想那样。我希望向他们发送json错误消息,代码为401

此示例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>


有什么想法吗?

因为ASP.NET正在处理“401未授权”状态,并将用户跳转到登录页面-这就是它处理来自服务器的401消息的方式


您可以尝试将其设置为“403禁止”,尽管我认为ASP.NET也倾向于将其发送到登录处理程序(这有点麻烦),或者只是简单的“400错误请求”

此行为取决于您正在使用的System.Web.Security.FormsAuthenticationModule(如果我没记错的话,默认情况下处于活动状态)。它不仅监视AuthenticateRequest事件,还监视EndRequest事件以查找HTTP代码401。 这是其他模块(例如System.Web.Security.UrlAuthorizationModule)发出“评估”信号的方式

如果您的url是API,也许您可以使用

<location />

元素,并微调配置。 嗯

编辑:更多

我不确定我的建议是否对你有帮助:-)也许你的想法更好

无论如何

这是你的参考资料。简而言之,您可以为特定路径决定一组不同的配置。还有另一种方法不完全相同:利用.config文件的性质

我假设您的API是更大的web应用程序的一部分

在您的例子中,您应该评估URL/api/search/foo(在您的示例中)是否需要不同的行为。如果您需要另一个,请参阅“位置”的参考资料,并尝试确定是否可以关闭某些功能


如果您的应用程序是“just”API,那么您可以删除所有不需要的模块(特别是负责重定向的FormsAuthenticationModule)。

尝试处理Globals.asax的应用程序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);
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);
    }
}
在应用程序中,请求如下内容:

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);
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);
    }
}

是我,还是你把你的状态码设为401?401-正确。我会更新我的帖子。找不到404页。工作结束时大脑会衰退。。哎呀!嗨,法布里齐奥。。。你能详细说明一下这个配置元素吗?它有什么作用?好吧,我加了点东西,但是。。。我认为扎夫的解决方案更好403禁止:-授权将无效,请求不应重复。--如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)