So authentifizieren Sie eine WPF-Clientanforderung bei ASP .NET WebAPI 2
Ich habe gerade eine erstelltASP .NET MVC 5-Web-API Projekt und fügte das Entity Framework-Modell und andere Dinge hinzu, mit denen es funktioniertASP. NET Identität.
Jetzt muss ich eine einfache authentifizierte Anforderung für die Standardmethode dieser API von der WPF-Client-App aus erstellen.
ASP .NET MVC 5-Web-API-Code
[Authorize]
[RoutePrefix("api/Account")]
public class AccountController : ApiController
// GET api/Account/UserInfo
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
[Route("UserInfo")]
public UserInfoViewModel GetUserInfo()
{
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
return new UserInfoViewModel
{
UserName = User.Identity.GetUserName(),
HasRegistered = externalLogin == null,
LoginProvider = externalLogin != null ? externalLogin.LoginProvider : null
};
}
WPF-Clientcode
public partial class MainWindow : Window
{
HttpClient client = new HttpClient();
public MainWindow()
{
InitializeComponent();
client.BaseAddress = new Uri("http://localhost:22678/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json")); // It tells the server to send data in JSON format.
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Test();
}
private async void Test( )
{
try
{
var response = await client.GetAsync("api/Account/UserInfo");
response.EnsureSuccessStatusCode(); // Throw on error code.
var data = await response.Content.ReadAsAsync<UserInfoViewModel>();
}
catch (Newtonsoft.Json.JsonException jEx)
{
// This exception indicates a problem deserializing the request body.
MessageBox.Show(jEx.Message);
}
catch (HttpRequestException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
}
}
}
Es scheint, als würde eine Verbindung zum Host hergestellt und ich erhalte den richtigen Fehler. Das ist ok.
Antwortstatuscode zeigt keinen Erfolg an: 401 (Nicht autorisiert).
Das Hauptproblem, dass ich nicht sicher bin, wie ich Benutzernamen und Passwort mit WPF Client senden soll ...
(Leute, ich frage nicht, ob ich es verschlüsseln und Auth Filter über API-Methodenimplementierungen verwenden muss. Das werde ich sicher später tun ...)
Ich habe gehört, dass ich in der Header-Anfrage einen Benutzernamen und ein Passwort senden muss ... aber ich weiß nicht, wie dies mithilfe von geschehen kannHttpClient client = new HttpClient();
Danke für jeden Hinweis!
P.S. Muss ich ersetzenHttpClient
mitWebClient
und verwendenTask
(Die Authentifizierung beim ASP.NET-Web-API-Dienst mit HttpClient ist nicht möglich)?