我已按照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无效,如何重定向呢?
答案 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,那么声明就不会存在,他们仍然会失去访问权限。