Дуэнде - Единый вход в систему BFF
Я пытаюсь реализовать единый вход с помощью инфраструктуры безопасности Duende Backend for Frontend (BFF).
Этот репозиторий GitHub демонстрирует поведение, которое я вижу.
Он содержит 3 сайта:
- Blazor WASM (размещенный) — с использованием BFF, как описано в официальной документации .
- Сайт MVC
- Веб-сайт (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>
Дайте мне знать, как это происходит.