当我将ASP.NET HTTP状态码硬编码为401时,我会一直跳转到登录页面?
我有一个API设置。当用户提供一个无效/丢失的API密钥时,我试图将Response.StatusCode设置为401,有东西不断地将我跳转到我的登录页面。这是一个API。。。所以我不想那样。我希望向他们发送json错误消息,代码为401 此示例api的url为:当我将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/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(未找到)