Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET对控制器的未经授权访问应返回401而不是200和登录页_Asp.net_Asp.net Mvc_Asp.net Identity_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

ASP.NET对控制器的未经授权访问应返回401而不是200和登录页

ASP.NET对控制器的未经授权访问应返回401而不是200和登录页,asp.net,asp.net-mvc,asp.net-identity,asp.net-core,asp.net-core-mvc,Asp.net,Asp.net Mvc,Asp.net Identity,Asp.net Core,Asp.net Core Mvc,在ASP.NET 5应用程序中,我将MVC和标识框架配置为: app.UseMvc(配置=>{ config.MapRoute(“默认值”,“{controller}/{action}/{id?}”,新建 { controller=“Home”, action=“Index” }); }); 以及增加身份识别服务: services.AddAuthentication(); services.AddAuthorization(); services.AddIdentity(配置=>{ conf

ASP.NET 5
应用程序中,我将MVC和标识框架配置为:

app.UseMvc(配置=>{
config.MapRoute(“默认值”,“{controller}/{action}/{id?}”,新建
{
controller=“Home”,
action=“Index”
});
});
以及增加身份识别服务:

services.AddAuthentication();
services.AddAuthorization();
services.AddIdentity(配置=>{
config.User.RequireUniqueEmail=true;
})
.AddUserStore()
.AddRoleStore()
.AddDefaultTokenProviders();

app.UseIdentity()
.UseCookieAuthentication(i=>{i.LoginPath=“/Account/Login”;});
该示例定义如下:

公共类MyApiController:Microsoft.AspNet.Mvc.Controller
{
[授权]
公共异步任务我找到了这个

services.AddCookieAuthentication(配置=>
{
config.LoginPath=“/Auth/Login”;
config.Events=new CookieAuthenticationEvents()
{
OnRedirect=ctx=>
{
if(ctx.Request.Path.StartsWithSegments(“/api”)&&
ctx.Response.StatusCode==200)
{
ctx.Response.StatusCode=(int)HttpStatusCode.Unauthorized;
返回Task.FromResult(空);
}
其他的
{
响应重定向(ctx.RedirectUri);
返回Task.FromResult(空);
}
}
};
});

但这真的应该是预期的方法吗?对我来说,这有点异味。

这个问题已经在
RC1
中解决了

请在此处查看GitHub评论:

要升级到
RC1
,请转到


更确切地说,您还可以在获取最新版本之前清除
%userprofile%\.dnx\
文件夹。

一种解决方案是使用以下标题发送请求:

[{"key":"X-Requested-With","value":"XMLHttpRequest"}]
下面是一个示例,使用不带标题的Postman返回200并登录网页html

带有标题返回401,没有内容(注意,标题旁边没有勾号)

示例应用程序基于ASP.NET核心默认解决方案,具有个人用户身份验证

为什么会这样:
CookieAuthenticationEvents.OnRedirectToLogin()
使用
IsAjaxRequest(context.Request)
来决定是返回401还是重定向。因此,您必须有一个头来生成
IsAjaxRequest(context.Request)
return true。如果您通过AJAX调用API,许多JavaScript库似乎会自动为您添加此选项,但您可能没有使用它们

您可能会发现相关问题很有帮助

这种行为是由于OP的加入(他们在问题下提到)

在撰写本文时,链接到
CookieAuthenticationEvents.cs
的版本。

一个(解决方法)选项是使coockie选项将您重定向到返回(未经授权)结果的控制器操作
很抱歉,我正在使用手机回复。当我使用电脑时,我将尝试增强我的回答。

我建议您在好主意时打开一个问题:张贴在此处:您将获得重定向,因为cookie身份验证系统通过重定向到您指定的路径来处理授权挑战。控制器不应直接影响此behaviour和将cookie身份验证与控制器(甚至MVC)耦合是一种更糟糕的气味。您必须如上所述处理OnRedirect,但我们在请求上使用其他元数据来做出决定,如接受头(application/json,text/html),或者是ajax Request这是一个怎样的答案?这是一个指向OP在评论中提出的同一个问题的链接,该评论说他们在另一个网站上提出了相同的问题。1)这是一个只包含链接的答案2)该链接没有代码示例,只是一个指向git提交的链接,这是您要求的(除非有人觉得需要使用相同的用户名和图片模拟您)