mvc6未经授权导致重定向

时间:2016-01-13 15:42:12

标签: redirect asp.net-core identity asp.net-core-mvc unauthorized

当我从Controller返回NotAuthorized IActionResult时,我一直在尝试阻止重定向,但无论我的尝试如何,NotAuthorized都会被转换为重定向。

我已经尝试了提到的here(同样的问题,使用旧的beta框架,我使用的是1.0.0-rc1-final)。我没有Notifications命名空间(已在rc1-final中删除)。

这是我的登录控制器:

    [HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                return Ok(model);
            }
            if (result.IsLockedOut)
            {
                return new HttpStatusCodeResult((int)HttpStatusCode.Forbidden);
            }
            else
            {
                return HttpUnauthorized();
            }
        }
        return HttpUnauthorized();
    }

在Startup.cs中,我尝试了以下变体:

        services.Configure<CookieAuthenticationOptions>(o =>
        {
            o.LoginPath = PathString.Empty;
            o.ReturnUrlParameter = PathString.Empty;
            o.AutomaticChallenge = false;
        });

每次登录失败时(请忽略密码在Ok上返回)并且应该导致空的401页面,我将重定向到/ Account / Login。这里的诀窍是什么?

4 个答案:

答案 0 :(得分:9)

解决方案不是直接配置CookieAuthenticationOptions,而是通过IdentityOptions这样做:

        services.Configure<IdentityOptions>(o =>
        {
            o.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents()
            {
                OnRedirectToLogin = ctx =>
                {
                    if (ctx.Response.StatusCode == (int)HttpStatusCode.Unauthorized)
                    {
                        return Task.FromResult<object>(null);
                    }
                    ctx.Response.Redirect(ctx.RedirectUri);
                    return Task.FromResult<object>(null);
                }
            };
        });

答案 1 :(得分:8)

从这里采取(Shawn Wildermuth - &gt; ASP.NET 5身份和REST API - &gt;评论&#34; Mehdi Hanafi&#34;)并使用Postman测试API

config.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents()
{
    OnRedirectToLogin = ctx =>
    {
        if (ctx.Request.Path.StartsWithSegments("/api") &&
        ctx.Response.StatusCode == 200)
        {
            ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            return Task.FromResult<object>(null);
        }
        else
        {
            ctx.Response.Redirect(ctx.RedirectUri);
            return Task.FromResult<object>(null);
        }
    }
};

答案 2 :(得分:4)

来自Identity 2.0, 你需要添加:

using Microsoft.AspNetCore.Authentication.Cookies;

并在ConfigureServices中:

services.ConfigureApplicationCookie(options =>
{
    options.Events = new CookieAuthenticationEvents
    {
        OnRedirectToLogin = (x =>
        {
            if (x.Request.Path.StartsWithSegments("/api") && x.Response.StatusCode == 200)
                x.Response.StatusCode = 401;

            return Task.CompletedTask;
        }),
        OnRedirectToAccessDenied = (x =>
        {
            if (x.Request.Path.StartsWithSegments("/api") && x.Response.StatusCode == 200)
                x.Response.StatusCode = 403;

            return Task.CompletedTask;
        })
    };
});

段检查当然应根据您的路线进行调整。

答案 3 :(得分:2)

如果您有一些需要重定向的网页和其他不应重定向的网址,请参阅此问题,以获取仅针对非API网址使用默认重定向逻辑的解决方案:

Suppress redirect on API URLs in ASP.NET Core