Дуэнде - Единый вход в систему BFF

Я пытаюсь реализовать единый вход с помощью инфраструктуры безопасности Duende Backend for Frontend (BFF).

Этот репозиторий GitHub демонстрирует поведение, которое я вижу.

Он содержит 3 сайта:

  1. Blazor WASM (размещенный) — с использованием BFF, как описано в официальной документации .
  2. Сайт MVC
  3. Веб-сайт (Razor Pages)

Проект IdentityServer настроен для обслуживания всего вышеперечисленного.

При входе в систему через MVC или через Интернет сайт Blazor не выглядит зарегистрированным. При входе в систему через Blazor все 3 сайта кажутся зарегистрированными.

Я не уверен, что это связано с тем, как я настроил проект IdentityServer, но я не могу добраться до корня проблемы.

1 ответ

Для Duende IdentityServer BFF следующая конфигурация клиента подойдет;

      new()
            {
                ClientId = "wasmlocal",
                ClientSecrets = { new Secret("secret".Sha256()) },

                AllowedGrantTypes = GrantTypes.CodeAndClientCredentials,

                RedirectUris = { "https://localhost:5002/signin-oidc" },
                
                //FrontChannelLogoutUri = "https://localhost:5002/signout-oidc",
                BackChannelLogoutUri = "https://localhost:5002/bff/backchannel",

                PostLogoutRedirectUris = { "https://localhost:5002/signout-callback-oidc" }
                ,
                AllowOfflineAccess = true,
                AllowedScopes = { "openid", "profile", "api 1", "roles", "EmployeeID" }

            }
You may need to configure other resources such Identity Resource and API resources.
While the BackEnd of the Blazor Wasm hosted application,
should be as follows;

    builder.Services.AddAuthentication(options =>
            {
                options.DefaultScheme = "cookie";
                options.DefaultChallengeScheme = "oidc";
                options.DefaultSignOutScheme = "oidc";
            })
            .AddCookie("cookie", options =>
            {
                options.Cookie.Name = "__Host-blazor";
                options.Cookie.SameSite = SameSiteMode.Strict;
                options.ExpireTimeSpan = TimeSpan.FromMinutes(15);
                // sliding or absolute
                options.SlidingExpiration = false;
           
                options.Events.OnSigningOut = async e =>
                {
                    // automatically revoke refresh token at signout time
                    await e.HttpContext.RevokeUserRefreshTokenAsync();
                };
          
            })
            .AddOpenIdConnect("oidc", options =>
            {
             
                options.Authority = "https://localhost:5001/";
                
                options.ClientId = "clientname";
                options.ClientSecret="secret";
                options.UsePkce = true;
                options.ResponseType = "code";
                options.ResponseMode = "query";
                
                options.MapInboundClaims = false;
    
                options.GetClaimsFromUserInfoEndpoint = true;
                options.SaveTokens = true;
    
                // request scopes + refresh tokens
                options.Scope.Clear();
                options.Scope.Add("openid");
                options.Scope.Add("profile");
                options.Scope.Add("API 1");
    
                options.Scope.Add("roles");
          
    
                options.Scope.Add("offline_access");
    
                
    
                options.GetClaimsFromUserInfoEndpoint = true;
    
           
            });
     

Then on the client make sure you coordinate the login flow; by triggering oidc code challenge by attributing  your secure pages with @attribute [Authorize], such as 

@attribute [Authorize]

<h1>Hello, Blazor BFF!</h1>

<AuthorizeView>
    <Authorized>
        <h3>Current session:</h3>
        
        <dl>
            @foreach (var claim in @context.User.Claims)
            {
                <dt>@claim.Type</dt>
                <dd>@claim.Value</dd>
            }
        </dl>
    </Authorized>
</AuthorizeView>

Дайте мне знать, как это происходит.

Другие вопросы по тегам