gpt4 book ai didi

c# - 如何验证 WPF 客户端对 ASP .NET WebAPI 2 的请求

转载 作者:太空狗 更新时间:2023-10-29 18:35:33 25 4
gpt4 key购买 nike

我刚刚创建了一个 ASP .NET MVC 5 Web API 项目并添加了 Entity Framework 模型和其他东西以使其与 ASP. NET Identity 一起工作.

enter image description here

现在我需要创建一个简单的经过身份验证的请求,从 WPF 客户端应用程序向该 API 的标准方法发送请求。

ASP .NET MVC 5 Web API 代码

[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 客户端代码

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
{
}
}
}

它似乎正在连接到主机,我得到了正确的错误。没关系。

Response status code does not indicate success: 401 (Unauthorized).

我不确定如何使用 WPF 客户端发送用户名和密码的主要问题...

(伙计们,我不是在问我是否必须加密它并在 API 方法实现上使用 Auth Filter。我稍后肯定会这样做......)

我听说我必须在 header 请求中发送用户名和密码...但我不知道如何使用 HttpClient client = new HttpClient();

感谢任何线索!

附言我是否将 HttpClient 替换为 WebClient 并使用了 Task ( Unable to authenticate to ASP.NET Web Api service with HttpClient )?

最佳答案

您可以像这样发送当前登录的用户:

    var handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
_httpClient = new HttpClient(handler);

然后您可以创建自己的授权过滤器

public class MyAPIAuthorizationFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
//perform check here, perhaps against AD group, or check a roles based db?
if(success)
{
base.OnActionExecuting(actionContext);
}
else
{
var msg = string.Format("User {0} attempted to use {1} but is not a member of the AD group.", id, actionContext.Request.Method);
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new StringContent(msg),
ReasonPhrase = msg
});
}
}
}

然后在您想要保护的 Controller 中的每个操作上使用 [MyAPIAuthorizationFilter]。

关于c# - 如何验证 WPF 客户端对 ASP .NET WebAPI 2 的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com