在ASP.NET Core中cookie验证失败后重定向

时间:2017-08-23 01:02:37

标签: c# asp.net authentication cookies asp.net-core

我已按照ASP.NET docs

中的说明实施了Cookie验证程序
public static class CookieValidator
{
    public static async Task ValidateAsync(CookieValidatePrincipalContext context)
    {
        ...

        if (invalidCookie)
        {
            context.RejectPrincipal();
            await context.HttpContext.Authentication.SignOutAsync("MyCookieScheme");
        }
    }
}

它似乎正常工作并进入invalidCookie区块,拒绝委托人并退出。之后我想重定向到另一个URL。如果我使cookie无效,如何重定向呢?

1 个答案:

答案 0 :(得分:0)

当拒绝主体时,它应该已经返回302并使用“ AccessDeniedPath”或“ LoginPath”将“ location”标头添加到您的响应中,但是可以说您想添加标头来更改状态码或其他定制。

在invalidCookie块中,您可以使用以下设置自定义标头。

context.httpContext.Response.Headers["forceRedirect"] = httpContext.Request.Host.ToString();

然后,当您在客户端上获得响应时,您需要检查此标头是否存在,如果存在,则您重定向到给定的链接。这允许您至少设置标头,但是,如果在同一位置更改状态代码,则在拒绝主体时(在退出ValidateAsync函数之后),框架仍将覆盖状态代码。

为此,要阻止框架覆盖您的自定义响应,您必须声明一个onRedirectToAccessDenied函数。

在startup.cs中:ConfigureServices

services.ConfigureApplicationCookie(options => { //this just makes checks against the cookie, so if the user deletes the cookie then ValidateAsync never fires
            // Cookie settings ...
            options.Events.OnRedirectToAccessDenied = CookieValidator.overrideRedirect;
            options.Events.OnValidatePrincipal = CookieValidator.ValidateAsync;
        });

然后使用CookieValidator:

值得注意的是,如果执行此操作,则其他拒绝也将执行此代码。就像您还具有“角色”授权一样,当用户未通过该授权时,它将调用此权限。如果您希望代码根据身份验证失败的原因返回不同的响应,这可能会令人沮丧我正在使用策略来解决此问题,并让它们返回自定义响应,因为它确切知道失败的原因,然后将overrideRedirect为空,因此框架不会更改响应。

internal static async Task overrideRedirect(RedirectContext<CookieAuthenticationOptions> context) {
        ...
        //In here you can customize the response anyway you want and it will not be changed
    }

应注意,仅当请求中存在cookie时才调用ValidateAsync,因此,如果用户删除cookie,则可以跳过此验证。就我而言,我通过在此处验证cookie来解决此问题,但后来仍然有其他身份验证代码(我在IAuthorizationHandler中添加了策略要求),后来又验证了用户的主张。如果用户删除了他们的cookie,那么声明就不会存在,他们仍然会失去访问权限。