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提交的链接,这是您要求的(除非有人觉得需要使用相同的用户名和图片模拟您)