aspnetcore: Cannot provide a value for property 'AuthenticationService' on type 'Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticatorView'. There is no registered service of type 'Microsoft.AspNetCore.Components.WebAssembly.Authentication.IRemoteAuthenticationService`1[Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationState
Is there an existing issue for this?
- I have searched the existing issues
Describe the bug
I have no Idea what is causing this, but no matter what when I try and login, I get redirected to an error page reading:
Cannot provide a value for property 'AuthenticationService' on type 'Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticatorView'. There is no registered service of type 'Microsoft.AspNetCore.Components.WebAssembly.Authentication.IRemoteAuthenticationService1[Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationState
`
Working on blazor hosted project using netcore 8 rc 2. Be happy to provide code or more information, but this is driving me a little crazy.
Expected Behavior
No response
Steps To Reproduce
No response
Exceptions (if any)
No response
.NET Version
No response
Anything else?
No response
About this issue
- Original URL
- State: open
- Created 8 months ago
- Reactions: 1
- Comments: 24 (9 by maintainers)
Thanks for the repro @dudley810. It looks like this issue is trying to use types like
RemoteAuthenticatorViewfromMicrosoft.AspNetCore.Components.WebAssembly.Authenticationin components that can be server rendered. This is not supported.Since we want to be able to authenticate the user during server-side rendering, it’s better to use cookies rather than JwtBearer and MSAL.js. I opened a PR is at https://github.com/dudley810/dotnet8identityopenid/pull/1 to use
AddMicrosoftIdentityWebAppwhich uses cookies like you would for other server rendered UI stacks (e.g. MVC and Razor pages) instead ofAddMicrosoftIdentityWebApi.Of course, we still need to be able to flow authentication state from the server to the client for client-side rendering. To do this, the PR defines custom
AuthenticationStateProvider’s on both the server and client. They utilizePersistentComponentStateto serialize and deserialize the authentication state as render modes transition.If you need the JWT token, you can use OpenIdConnectOptions.SaveTokens and then access it from the
HttpContextlike so:You theoretically could then flow the access token to the client to have it make requests with it directly, but that’s strongly discouraged:
https://learn.microsoft.com/entra/identity-platform/v2-oauth2-on-behalf-of-flow#middle-tier-access-token-request
You can however use this access token from your API controllers and follow the backend for frontend or BFF pattern. https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends
I’m getting the same error when using a similar project structure to @dudley810 but with OIDC rather than MSAL. Server-side login is working fine, but when the WASM loads, it redirects to a blank page and get that error in the console. I’ve even tried manually injecting the RemoteAuthService and it still fails to render the authentication component.
builder.Services.AddScoped<IRemoteAuthenticationService<RemoteAuthenticationState>, RemoteAuthenticationService<RemoteAuthenticationState, RemoteUserAccount, OidcProviderOptions>>();I’m at a loss and can’t figure out how to solve this issue.
I created a sample for this issue. https://github.com/dudley810/dotnet8identityopenid. @halter73 and @mkArtakMSFT let us know if there is any other information you need. Seems like @dlgombert and I are having the same issue but not sure how similar his project is to mine.
@halter73 Any reason the PersistentAuthenticationStateProviders are Singletons and not Scoped? Especially given the PersistingComponentState is only persisting on a static key?
builder.Services.AddSingleton<AuthenticationStateProvider, PersistentAuthenticationStateProvider>();This explanation is pure gold! Easily the clearest (and most succinct) explanation I’ve seen of the preferred flow for auth when using components that need to support static server-side rendering. Will be great to see this sort of thing in the docs come next week 😃
Yes. That’s what I’m working on as part of #49668 and why had code ready to quickly open a PR at https://github.com/dudley810/dotnet8identityopenid/pull/1. Thanks for pointing out that we need add a “Prerendering with authentication” section back as part of this.
UserInfo,PersistingAuthenticationStateProvider(server), andPersistentAuthenticationStateProvider(client) in https://github.com/dudley810/dotnet8identityopenid/pull/1 are substitutes forRemoteUserAccount,RemoteAuthenticationService,RemoteAuthenticatorView, etc…The
RemoteAuthenticationServiceis designed to be used exclusively fromWebAssemblywhereas the PersistentComponentState-basedPersistingAuthenticationStateProvideralso works while prerendering the component.Thanks @halter73. I implemented your solution with OIDC and it’s now working as expected. Is this something that can be added into the docs? As part of the .NET 7 docs, there is a section that mentions pre-rendering not being supported with auth. This section has been removed in the .NET 8 version but hasn’t been replaced with anything else. There is also nothing mentioned about InteractiveAuto and auth either that I could find. e.g. In .NET 7 docs: https://learn.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/additional-scenarios?view=aspnetcore-7.0#prerendering-with-authentication
https://dotnetbuilds.azureedge.net/public/Sdk/8.0.100-rtm.23519.30/dotnet-sdk-8.0.100-rtm.23519.30-win-x64.exe
Or you can use one of the install scripts at https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script
@halter73 - Where can you get the 8.0.100-rtm.23519.30 to install?