Установите CurrentPrincipal в асинхронном входе в систему в WPF
Я искал это в интернете и не мог найти действительно работающего решения. Ситуация выглядит следующим образом: у меня есть приложение WPF, где я хочу представить пользователю простую форму входа в систему. Пытаюсь работать с MVVM, поэтому у меня есть LoginViewModel со следующим кодом за командой login:
try { WithClient(servfact.GetServiceClient<IAccountService>(), proxy => { principal = proxy.AuthenticateUser(Login, password); }); Thread.CurrentPrincipal = principal; } catch(...) { ... }
"WithClient" - это короткий метод в моем базовом классе viewmodel, который я использую для создания экземпляра и удаления моих прокси-серверов службы:
protected void WithClient<T>(T proxy, Action<T> codeToExecute) { try { codeToExecute(proxy); } finally { IDisposable toDispose = (proxy as IDisposable); if(toDispose != null) { toDispose.Dispose(); } } }
Теперь большинство моих сервисов асинхронны, и у меня есть асинхронный вариант WithClient, который также отлично работает:
protected async Task WithClientAsync<T>(T proxy, Func<T, Task> codeToExecute) { try { await codeToExecute(proxy); } finally { IDisposable toDispose = (proxy as IDisposable); if(toDispose != null) { toDispose.Dispose(); } } }
The trouble begins whenever I also want to do the login asynchronously. Obviously I don't want the UI to freeze up as I do the login (or visit any WCF service for that matter). That in itself is working fine, but the problem sits in the piece of code where I set the CurrentPrincipal. This problem is probably familiar to most of you: it seems to set it just fine. Then in my program I want to use the CurrentPrincipal (either on the client side or to send the users login to a WCF service in a messageheader), but it seems to be reset to a standard GenericPrincipal. When I revert the login back to being synchronous, the CurrentPrincipal is just fine. So in short: how do I set the principal in the asynchronous code, having it persist later on, instead of reverting back to a standard principal?