情况:我从PageModel返回Forbid()
,并通过重定向(302)发起对/AccessDenied&returnUrl=...
的响应
在此指定路径:
// configuration was used
serviceCollection.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = new PathString("/AccessDenied");
});
但是如何完全覆盖“重定向响应”的创建并指定我自己的GET参数(诸如returnUrl
)或重新定义returnUrl
值(我想传递保存的我自己的值)在自定义请求功能)中?
或者,我可以手动重定向到AccessDenied,而不是返回Forbid()
。但是我想和Forbid()
在一起,以确保演示性和一致性。
更新:这也不起作用
public void ConfigureServices(IServiceCollection serviceCollection)
{
serviceCollection.ConfigureApplicationCookie(options =>
{
//options.AccessDeniedPath = new PathString("/AccessDenied");
options.Events.OnRedirectToAccessDenied = context =>
{
context.Response.Redirect("/AccessDenied&t=100");
return Task.CompletedTask;
};
});
// need for password reset functionality
serviceCollection.AddDbContext<WebUserDbContext>(optionsBuilder =>
optionsBuilder.UseSqlServer(ApplicationSettings.WebUserStorageConfiguration.ConnectionString));
serviceCollection.AddIdentity<WebUser, IdentityRole<int>>( options =>
{
options.SignIn.RequireConfirmedEmail = true;
})
.AddEntityFrameworkStores<WebUserDbContext>()
.AddDefaultTokenProviders();
// generally it is a version of routin by
serviceCollection.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
P.S。这是不需要身份验证但可以管理用户记录的服务站点。因此,该站点未启用MS Identity Lib身份验证。由于我需要特定的Identity API功能:“重置密码”,因此身份类型刚刚放入容器中。这是一种愚蠢的情况:UserManager
一样的Identity API类是如此复杂,以至于除了从DI /容器中获取之外,都无法用其他方法来构造它们。请不要在您的API中分享这种MS DI疯狂。
有趣的是,没有serviceCollection.AddIdentity
浏览器在.Forbid()
上接收到“错误500”,并且断点仍不会在context.Response.Redirect("/AccessDenied&t=100");
上停止
答案 0 :(得分:1)
重定向到已配置的class Bar<T> {
static create<T>(x: T) {
console.log("Bar");
return new Bar(x);
}
static barOnly() { }
constructor(public readonly x: T) { }
}
class FooBar<T> extends (Bar as new <T>(x: T) => Bar<T>)<T> {
static create<T>(x: T, y: T) {
return new FooBar<T>(x, y);
}
constructor(x: T, public readonly y: T) {
super(x);
}
}
是cookie身份验证的默认行为。它将自动添加一个AccessDeniedPath
参数,该参数默认为当前URL。如果您在身份验证属性中指定returnUrl
,则将使用该URL。
例如,在控制器内部:
RedirectUri
这基本上会生成到URL return Forbid(new AuthenticationProperties
{
RedirectUri = Url.Action("ActionAfterForbid"),
});
的重定向。
如果需要更多自定义,还可以覆盖Cookie身份验证选项的RedirectToAccessDenied
event:
{AccessDeniedPath}?returnUrl=/exampleController/ActionAfterForbid
在那里,您可以做任何您想做的事情。
请注意,您必须在致电services.ConfigureApplicationCookie(options =>
{
options.Events.OnRedirectToAccessDenied = context =>
{
// context.Options.AccessDeniedPath would be the configured path
// context.RedirectUri is the passed or automatically set up redirect URI
// context.HttpContext is the HttpContext if you want to modify features
// default behavior is basically this:
context.Response.Redirect(context.RedirectUri);
return Task.CompletedTask;
};
});
之后呼叫ConfigureApplicationCookie
。这是因为后者将使用一些默认值配置应用程序cookie本身,因此,如果配置身份验证事件,它们将被AddIdentity
覆盖。相反,您想用AddIdentity
覆盖默认值,因此您之后必须调用它。