英文:
How to handle AuthenticationState in WPF?
问题
我有一个使用 JWT 从 API 获取用户声明的 .NET 7 WPF 应用程序。登录过程正常工作。但是我不知道应该在 WPF 部分存储用户信息在哪里。在 ASP.NET Core 中,我使用 AuthenticationStateProvider
,但似乎在 WPF 中没有这样的选项。
无论如何,以下是我目前的代码:
public partial class MainWindow
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<MainWindow> _logger;
public MainWindow(IHttpClientFactory httpClientFactory, ILogger<MainWindow> logger)
{
InitializeComponent();
_httpClientFactory = httpClientFactory;
_logger = logger;
}
private async void LoginButton_Click(object sender, RoutedEventArgs e)
{
var client = _httpClientFactory.CreateClient();
var tokenResponse =
await client.PostAsJsonAsync("https://localhost:5001/api/login/pos", new LoginCredentials(UsernameTextBox.Text, PasswordBox.Password));
if (tokenResponse.IsSuccessStatusCode)
{
LoginResult loginResult = await tokenResponse.Content.ReadFromJsonAsync<LoginResult>();
string token = loginResult.Token;
SetPrincipal(token);
}
else
{
MessageBox.Show(await tokenResponse.Content.ReadAsStringAsync(), "Login failed");
}
}
private void SetPrincipal(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadJwtToken(token);
var claims = jwtToken.Claims;
var identity = new ClaimsIdentity(claims);
var principal = new ClaimsPrincipal(identity);
System.Threading.Thread.CurrentPrincipal = principal;
AppDomain.CurrentDomain.SetThreadPrincipal(principal);
}
}
我正在阅读关于 Thread.CurrentPrincipal
的内容,但不确定这是否是正确的方法。
在 .NET 7 WPF 应用程序中存储和访问用户信息是否有常见的方法,还是我需要自己实现它?
英文:
I am having a net 7 Wpf app that get's the user claims from an API on login using jwt. The login process is working. But i don't know where i should store the user's information on the Wpf side. In asp.net core I use the AuthenticationStateProvider
but it seems there is no such option for Wpf.
Anyway here's the current code i have:
public partial class MainWindow
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<MainWindow> _logger;
public MainWindow(IHttpClientFactory httpClientFactory, ILogger<MainWindow> logger)
{
InitializeComponent();
_httpClientFactory = httpClientFactory;
_logger = logger;
}
private async void LoginButton_Click(object sender, RoutedEventArgs e)
{
var client = _httpClientFactory.CreateClient();
var tokenResponse =
await client.PostAsJsonAsync("https://localhost:5001/api/login/pos", new LoginCredentials(UsernameTextBox.Text, PasswordBox.Password));
if (tokenResponse.IsSuccessStatusCode)
{
LoginResult loginResult = await tokenResponse.Content.ReadFromJsonAsync<LoginResult>();
string token = loginResult.Token;
SetPrincipal(token);
}
else
{
MessageBox.Show(await tokenResponse.Content.ReadAsStringAsync(), "Login failed");
}
}
private void SetPrincipal(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadJwtToken(token);
var claims = jwtToken.Claims;
var identity = new ClaimsIdentity(claims);
var principal = new ClaimsPrincipal(identity);
System.Threading.Thread.CurrentPrincipal = principal;
AppDomain.CurrentDomain.SetThreadPrincipal(principal);
}
}
I was reading about Thread.CurrentPrincipal
but I am unsure if that is the correct approach.
Is there a common approach to store and access user information in a net 7 Wpf app or do I have to implement it myself?
答案1
得分: 1
在一个.NET 7 WPF应用程序中存储和访问用户信息是否有常用的方法,还是我需要自己实现?
如果您没有要求跨不同实例/运行的应用程序存储信息,您可以将其存储在应用程序的某个变量中,例如:
public static class ApplicationService
{
internal static string Token { get; set; }
}
如果您在应用程序中使用IPrincipal
执行授权操作,使用Thread.CurrentPrincipal
属性存储它似乎是一个不错的方法。
英文:
>Is there a common approach to store and access user information in a net 7 Wpf app or do I have to implement it myself?
If you don't have a requirement to store the information across different instances/runs of your app, you could just store it in a variable somewhere in your application, e.g.:
public static class ApplicationService
{
internal static string Token { get; set; }
}
If you use an IPrincipal
to perform authorization in your app, storing it using the Thread.CurrentPrincipal
property seems like a good approach.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论