【问题标题】:.net 5 Authentication Cookie not set.net 5 身份验证 Cookie 未设置
【发布时间】:2021-12-14 17:17:23
【问题描述】:

我有一个 Umbraco 9 .Net 5 AspNet Core 项目。

我正在尝试设置身份验证 cookie。我遵循了微软的指南并让它在一个单独的项目中工作,但是当我试图在我的 Umbraco 项目中实现它时它失败了。我不知道为什么,但我猜 Umbraco 9 配置也参与其中。

我已经在登录时在同一个控制器中获取 User.Identity.IsAuthenticated = true,但是一旦我重定向到另一个控制器,身份验证状态为 false。

我也尝试在配置 cookie 时设置 LoginPath 选项,但它仍然重定向到默认路径 (/Account/Login),所以这里的某些东西也不起作用

我的 StartUp.cs 如下所示

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddUmbraco(mEnvironment, mConfig)
            .AddBackOffice()
            .AddWebsite()
            .AddComposers()
            .Build();

        services.AddDistributedMemoryCache();

        //services.AddSession(options =>
        //{
        //    options.IdleTimeout = TimeSpan.FromSeconds(10);
        //    options.Cookie.HttpOnly = true;
        //    options.Cookie.IsEssential = true;
        //});

        services.AddControllersWithViews();
        services.AddRazorPages();

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
        { 
            options.LoginPath = "/portal/"; //not working, still redirects to default
        });

    }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseAuthentication();
        app.UseAuthorization();


        //umbraco setup 
        app.UseUmbraco()
            .WithMiddleware(u =>
            {
                u.UseBackOffice();
                u.UseWebsite();
            })
            .WithEndpoints(u =>
            {
                u.UseInstallerEndpoints();
                u.UseBackOfficeEndpoints();
                u.UseWebsiteEndpoints();
            });


        //app.UseSession();

    }

我的登录控制器操作如下所示:

public async Task<ActionResult> Login()
    {
        
        var claimsIdentity = new ClaimsIdentity(new List<Claim>
        {
            new Claim(UserClaimProperties.UserRole, MemberRole, ClaimValueTypes.String)
        }, CookieAuthenticationDefaults.AuthenticationScheme);
        var authProps = new AuthenticationProperties
        {
            ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
            IsPersistent = true,
            AllowRefresh = true,
            RedirectUri = "/"
        };

                    await HttpContext.SignInAsync(
            //CookieAuthenticationDefaults.AuthenticationScheme,  //from MS-example but isAuth will be false using this
            new ClaimsPrincipal(claimsIdentity), 
            authProps);

        var isAuthenticated = User.Identity.IsAuthenticated;

        return Redirect("/myview/");
    }

如果我在 SignInAsync 中将 Auth Scheme 设置为“Cookies”,就像在 Microsoft 示例中一样,isAuthenticated 将是错误的,但如果没有这个,我至少会在这里得到它。

当重定向到下一个操作时,User.Identity.IsAuthenticated 为 false。

有什么建议或者为什么我的 LoginPath 配置不起作用?

编辑:我不想为每个登录的用户创建 Umbraco 成员。我只想让用户登录到上下文并能够验证用户是否已登录我自己在我的控制器中。

编辑 2: 我尝试捕捉登录事件并在其中找到了一个断点。在我的演示应用程序(没有 umbraco)中,我将到达带有 Umbraco 的断点,这个断点永远不会被击中。这是因为 Umbraco 可能会覆盖此事件或劫持事件吗?

【问题讨论】:

    标签: authentication .net-core cookies umbraco


    【解决方案1】:

    你有没有机会看过 Scott Brady 关于"Umbraco frontend membership SSO using OpenID Connect"?的文章

    我已经按照 Scott 的方法成功让会员登录到我的 Umbraco v9 网站,这种方法也可能对您有所帮助。

    他还为"Umbraco backoffice SSO with OpenID Connect"some other very useful .NET Core specific articles 写了一篇文章,可能会对您有所帮助。

    【讨论】:

    • 谢谢努尔哈克。我实际上不想为每个登录的人创建一个 umbraco 成员。但也许我可以新建一个用户对象而不是从 umbraco 获取它,添加我需要的声明和对象所需的组,然后登录该用户目的。所以我不需要为每个登录的人创建一个 umbraco 成员。
    • 你现在知道为什么上面的例子不起作用了。 umbraco 配置阶段是否发生任何事情导致 cookie 丢失其信息?
    • 似乎我无法对 UmbracoIdentityUser 设置声明。只得到它们。不知道如何将我需要的其他信息与登录用户一起传递
    • 不确定,您的代码 Carl 中缺少什么,.Net 5/6 中的情况有些不同,而且 Umbraco 文档不多,因此我推荐了 Scott 的博客。
    【解决方案2】:

    不知道为什么,但是在测试了不同的身份验证方案后,我得到了一个错误,我测试的方案没有注册,我得到了一个已经注册的方案列表。 我想通过这样做

     services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
        { 
            options.LoginPath = "/portal/"; //not working, still redirects to default
        });
    

    我已经注册了“Cookies”方案。

    列出的已注册方案之一是“Identity.Application”,通过使用该方案,我可以从重定向控制器的上下文中获取用户身份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多