我正在使用AngularJs前端开发一个ASP.NET MVC 6 Web API应用程序。
当我离开会话十年,或者我试图未经授权调用Web API操作时,我希望收到401状态代码。 相反,我得到302,并尝试重定向到登录的默认路径(" /帐户/登录")。
所以我需要在Angular中处理这个问题。
从这里的其他论坛帖子和Google搜索我发现有些人在startup.cs中解决了他们的问题:
services.Configure<CookieAuthenticationOptions>(options =>
{
options.LoginPath = PathString.Empty;
});
对我来说没有运气。
我使用Identity作为身份验证后端,甚至添加
services.ConfigureIdentityApplicationCookie(options =>
{
options.LoginPath = PathString.Empty;
});
没有给我预期的结果。 ASP.NET文档建议使用这种方式返回401。
使用1.0.0-beta7 CLR x86,IIS Express。
答案 0 :(得分:6)
编辑:@EZI提出的解决方案是正确的。 在我的回答下面,这对最近发布的版本不起作用。
最后!我找到了解决方案!
为了完成,我开始在aspnet / Identity github上的源代码中找到这条评论。
// If the LoginPath is null or empty, the middleware will not look for 401 Unauthorized status codes, and it will not redirect automatically when a login occurs.
这给了我错误的指示。
使用ConfigureIdentityApplicationCookie&#39;进行调试。选项,我发现有一个代表在&#34; Notifications&#34;属性
OnApplyRedirect
宾果!
现在我可以控制重定向了。
services.ConfigureIdentityApplicationCookie(options =>
{
options.LoginPath = PathString.Empty;
options.Notifications = new CookieAuthenticationNotifications {
OnApplyRedirect = context => { context.Response.StatusCode = 401; }
};
});
这可能不是处理问题的好方法,但最终我在未经身份验证的情况下调用web.api操作时收到401 Unauthorized。
答案 1 :(得分:3)
对我来说,只需将AutometicAuthenticate设置为false即可。
services.Configure<IdentityOptions>(options =>
{
options.Cookies.ApplicationCookie.AutomaticAuthenticate = false;
options.Cookies.ApplicationCookie.AutomaticChallenge = false;
options.Cookies.ApplicationCookie.LoginPath = PathString.Empty;
});
答案 2 :(得分:1)
我的解决方案类似于@Ezi
确认为RC2工作
services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
options.Cookies.ApplicationCookie.AutomaticChallenge = false;
});