J'ai mis en place les éléments nécessaires pour créer un exemple sur lequel bâtir. Voici mon code.
Fichier de démarrage
<AuthorizeView> <Authorized> <p>Welcome, @context.User.Identity.Name</p> </Authorized> <NotAuthorized> <p>Not Logged In</p> </NotAuthorized> </AuthorizeView>
App.razor
public class CustomAuthenticationStateProvider : AuthenticationStateProvider { public override Task<AuthenticationState> GetAuthenticationStateAsync() { var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "john.smith@gmail.com"), }, "apiauth_type"); var user = new ClaimsPrincipal(identity); return Task.FromResult(new AuthenticationState(user)); } } }
customAuth
<Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> </Found> <NotFound> <CascadingAuthenticationState> <LayoutView Layout="@typeof(MainLayout)"> <p>Sorry, there's nothing at this address.</p> </LayoutView> </CascadingAuthenticationState> </NotFound> </Router>
index
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); services.AddSingleton<WeatherForecastService>(); services.AddSingleton<DoggoDataServices>(); services.AddSingleton<AddDoggoServices>(); services.AddSingleton<EventServices>(); services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();
Compte tenu du code, la page d'index affiche uniquement "non connecté". Est-ce que je manque quelque chose de si simple que je l'oublie Je suis nouveau dans Blazor.
3 Réponses :
Vous avez oublié d'ajouter CascadingAuthenticationState dans app.razor
<CascadingAuthenticationState> <UserSession> <Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> </Found> <NotFound> <LayoutView Layout="@typeof(MainLayout)"> <p>Sorry, there's nothing at this address.</p> </LayoutView> </NotFound> </Router> </UserSession> </CascadingAuthenticationState>
Merci pour votre perspicacité. J'ai inclus CascadingAuthenticationState dans mon code ci-dessus, sous la balise introuvable; mais j'ai tenté ce que vous avez mentionné par curiosité et toujours pas de chance.
Vous pouvez utiliser le modèle par défaut. Il a un exemple qui fonctionne.
Vous devez appeler
public void LogoutUser() { // reset identities and other related info (localstorage data if you have, etc). var identity = new ClaimsIdentity(); var user = new ClaimsPrincipal(identity); NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user))); }
Lorsque vous utilisez un fournisseur personnalisé, vous devez le notifier lorsqu'un utilisateur est authentifié. Exemple: Vous pouvez ajouter cette méthode à votre fournisseur personnalisé:
public void MarkUserAsAuthenticated(Users u) { // add your claims here. This is just an example. var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, u.UserName) }); var user = new ClaimsPrincipal(identity); NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user))); }
Et veuillez noter que vous devez créer et appeler une méthode similaire lorsqu'un utilisateur se déconnecte:
NotifyAuthenticationStateChanged