ASP.NET Core身份:如何重新定义禁止处理

时间:2019-06-08 23:07:59

标签: c# asp.net-core asp.net-core-2.2 asp.net-core-identity

情况:我从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");上停止

1 个答案:

答案 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覆盖默认值,因此您之后必须调用它。