问题
I'm testing the waters with a blazer server-side app and trying to get the logged user in a .razor page. This
UserManager.GetUserAsync(User)
works in .cshtml view, but I cannot find a way to get it to work in .razor page. There is no "User" property to access. I use the IdentityUser with my ApplicationUser model that extends IdentityUser. I'm using AspNetCore 3.0 Preview 6.
回答1:
If you surround your code with the AuthorizeView
component you can get access to a context
object that supplies the current user.
<AuthorizeView>
<Authorized>
<h1>Hello, @context.User.Identity.Name!</h1>
<p>You can only see this content if you're authenticated.</p>
</Authorized>
<NotAuthorized>
<h1>Authentication Failure!</h1>
<p>You're not signed in.</p>
</NotAuthorized>
</AuthorizeView>
If you don't want to use that approach you can request a cascading parameter called authenticationStateTask
, which is provided by the CascadingAuthenticationState
.
@page "/"
<button @onclick="@LogUsername">Log username</button>
@code {
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
private async Task LogUsername()
{
var authState = await authenticationStateTask;
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
Console.WriteLine($"{user.Identity.Name} is authenticated.");
}
else
{
Console.WriteLine("The user is NOT authenticated.");
}
}
}
回答2:
What I did:
- added this to Startup.ConfigureServices
services.AddHttpContextAccessor();
- used this to get the username in my .razor page, these 2 lines first
@inject UserManager<WebPageUser> UserManager
@inject IHttpContextAccessor HttpContextAccessor
- then the call to show the username like this:
<p>Hello @UserManager.GetUserName(HttpContextAccessor.HttpContext.User)</p>
来源:https://stackoverflow.com/questions/56970377/get-current-logged-user-in-asp-net-core-3-0-razor-page