Activities of "alexander.nikonov"

1 - done 2 - no errors: 3 - no errors

@alper,

thank you - I've installed version 3.3.2. But when I try to download "Modules" in Abp Suite - I still keep getting this animated progressbar and empty page:

I have this issue for a while, but before I had incompatible version of CLI, packages, Suite. Now I have everything 3.3.2 and still the issue is there... Page refresh does not help, just in case.

I also need ABP Suite 3.3.2 - I have all packages in the project and Abp Cli of this version. However, after I've uninstalled Abp Suite of the newest version (4.x) and try to install it again - supplying specific version parameter - I end up with this:

Thank you, @liangshiwei. The test project itself is running well. The issue is discussed and by using the suggested cookie approach it works well too. So I will close the ticket.

I did by the way i described. But as i mentioned, i would like to have this test version of the project above with Identity and HttpApi Host separated.

Hi,

Sorry I forgot your project version, this way only work for projects starting in 4.0.

I would be really grateful if you updated your test project and split IdentityServer and HttpApi.Host part - it will help me to troubleshoot authentication and test new ABP 4.0 things once we upgrade to this version.

Using cookies requires your backend and frontend to be on the same domain&port. Maybe you can use cache to store access_token.

I managed to do this using Cookies approach and it seems to work fine. Though, I will show my code here. If you find something not fully correct - please, comment here.

So, step 1: made Angular web app running via https. Modify SessionRequestHttpInterceptor (pass withCredentials: true):

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const modified = req.clone({
            setHeaders: { 'Content-Language': this.selectedLangCulture || '' }, withCredentials: true
        });

        return next.handle(modified);
    }

step 2: modify appsettings for HttpApi.Host: "AngularApp:HostUrl": "https://localhost:4200", "CorsOrigins": https://localhost:4200"

step 3: Middleware for HttpApi.Host:

 public static class ApplicationBuilderAccessTokenCookieMiddlewareExtension
    {
        public static IApplicationBuilder UseAccessTokenCookieMiddleware(this IApplicationBuilder app, string cookieName)
        {
            return app.Use(async (httpContext, func) =>
            {
                string token = null;
                token = httpContext.Request.Cookies[cookieName];
                if (token == null)
                {
                    token = httpContext.Request.Headers[HeaderNames.Authorization].ElementAtOrDefault(0);
                    if (token != null)
                    {
                        token = token.Replace("Bearer ", "");
                    }
                }
                if (token != null)
                {
                    httpContext.Response.Cookies.Append(cookieName,
                        token,
                        new CookieOptions
                        {
                            Path = "/",
                            HttpOnly = true,
                            SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict,
                            MaxAge = TimeSpan.FromMinutes(5),
                            IsEssential = true,
                            Secure = true
                        });
                }
                await func.Invoke();
            });
        }
    }

step 4: Middleware for IdentityServer:

public static class ApplicationBuilderAccessTokenCookieMiddlewareExtension
    {
        public static IApplicationBuilder UseAccessTokenCookieMiddleware(this IApplicationBuilder app, string cookieName)
        {
            return app.Use(async (httpContext, func) =>
            {
                if (
                    (httpContext.User.Identity?.IsAuthenticated != true || httpContext.Request.Path.StartsWithSegments("/account/logout"))
                    &&
                    httpContext.Request.Cookies[cookieName] != null
                    )
                {
                    httpContext.Response.Cookies.Delete(cookieName);
                }
                await func.Invoke();
            });
        }
    }

step 5: HangfireAuthorizationFilter + corresponding Razor error page:

public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
    {
        public bool Authorize([NotNull] DashboardContext context)
        {
            var path = context.GetHttpContext().Request.Path;
            var isResource = path != null && (path.Value.StartsWith("/css") || path.Value.StartsWith("/js") || path.Value.StartsWith("/font"));
            if (!context.GetHttpContext().User.Identity.IsAuthenticated && !isResource)
            {
                context.Response.ContentType = "text/html";
                context.Response.WriteAsync(new AccessDeniedPage().ToString(context.GetHttpContext()));
                return false;
            }
            return true;
        }
    }

I had the same problem too. Try clearing chrome cache.

Oh, you are right - i use localhost for dev env, so i had some tenant id there :) it helped.

And yes, all in all, identity works as expected for Hangfire page in this simplified configuration. Could you please split HttpApiHost and IdentityServer in your example? I suspect the root cause of my issue could be that. And if nevertheless sending identity continues working, I will have a look what could be different in our configurations.

I've tried all that I can in my case and the only way out was to create token cookie, as we discussed a bit earlier here. However, if it is possible to make it work without setting the cookie - it will be much better!

Looking forward for your updated example. Thanks!

BTW, just in case: we are still using ABP 3.3.2 - we are not ready to update to 4.x. If it is possible, please use the same version in your example.

Hi, thank you for the example. But I'm unable to run HttpApiHost, since there is no initial data. What additional steps are required after I run DbMigrator project and created the database?

And one question: could it be that your example does work (I believe it does :)) and mine - not, because HttpApiHost has IdentityServer integrated in your example and are two separate hosts in our case?

When you log in on the angular client, the auth server will also log in to the current user. I think you can redirect directly without doing anything

This is the first thing I have tried to do. Probably it would work, if Angular Dashboard was located as an Angular app page. But as you know, it is a server-side-generated.

So, Angular resides on http://localhost:4200 and Hangfire Dashboard (since it's a server-side-built) resides on https://localhost:44328 (HttpApiHost, but could be another ApiHost).

So this simple approach did not work and i now know why: because if we navigate between Angular app pages - we send XmlHttpRequests to get authenticated data back and build markup based on that. We do that adding access_token header everywhere. By this header IdentityServer is able to determine user identity.

If we do window.location or just go by some link to reach our Dashboard - we cannot add headers. We only can:

  1. send token via URL (bad approach)
  2. have it in cookies by the moment we are checking HttpContext identity (this is what we are discussing now and possibly it will work if Angular app is run via https too, need to check)
  3. (probably will work too and would be the best approach) have CORS manage the things - this last one supposes I need to create a new ClientId / Api Resources and all that stuff especially for Hangfire so IdentityServer would finally redirect us supplying currently authenticated user...

Make sure your blazor and HttpApi at same domain and port. it should be work(I have update example code).

I've tried it and - no, it does not save cookies, falling into the same "if" each time... In my case, since I'm testing it on local PC, I set domain = "localhost", the Hangfire dashboard is opened as window.open('https://localhost:44328/hangfire') from Angular app (not Blazor) residing at http://localhost:4200 - so ports cannot be the same (CORS between IdentityServer, HttpApiHost and Angular is set up, just in case and Angular app itself works properly). Probably the problem is that Angular app is working via http?

Showing 221 to 230 of 276 entries
Made with ❤️ on ABP v9.0.0-preview Updated on September 20, 2024, 08:30