【问题标题】:Authenticating with outside REST api使用外部 REST api 进行身份验证
【发布时间】:2013-12-12 16:59:18
【问题描述】:

我正在尝试使用最近由外部公司开发的外部 REST api。他们为我提供了一些 Java 代码来展示如何连接到它并检索数据,但到目前为止,我无法通过 C# MVC 4 获得任何结果。目前我什至无法登录系统。凭据是正确的,使用我在其他地方找到的示例似乎没有帮助。

有效的 Java 代码:

try{
  ClientConfig client_config = new ClientConfig();
  client_config.register(new HttpBasicAuthFilter(username,password));

  Client client = ClientBuilder.newClient(client_config);
  WebTarget web_target = client.target(url);
  Invocation.Builder invocation_builder = web_target.request();

  //This GET does the login with basic auth
  this.populateFromResponse(invocation_builder.get());
}
catch(final Exception e){
  System.out.println(e.toString());
}

好的,这里有一些我在 C# 中没有的对象,很明显,但我尝试过的所有方法都没有奏效。

我已尝试将信息放在请求的标头中:

request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password));

没有cookie,也试过了:

request.Credentials = new NetworkCredential(username, password);

什么都没有。如果我尝试这个,没有收到 cookie,并且仍然尝试访问 api 的任何其他部分,那么我会收到 401(未授权)错误。如果我只是尝试访问 api 的登录部分,request.GetResponse(); 不会引发错误。

我是 REST 服务的新手,因此感谢您提供任何帮助/指导。我只是问,因为我查找的其他所有内容似乎都不起作用。

编辑 以下是我构建请求的方式:

var request = (HttpWebRequest)WebRequest.Create(HostUrl + path);
request.Method = "GET";
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
var response = request.GetResponse() as HttpWebResponse;

编辑#2 感谢@BrianP 的回答,这让我更好地解决了这个问题。下面是我当前的代码(以及从 this question 获取的响应中收集 cookie 的附加内容),最终返回了成功代码:

var cookies = new CookieContainer();
var handler = new HttpClientHandler();
handler.CookieContainer = cookies;

var client = new HttpClient(handler);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)));
client.BaseAddress = new Uri(HostUrl);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var response = client.GetAsync(HostUrl + "/api/login/").Result;
var responseCookies = cookies.GetCookies(new Uri(HostUrl)).Cast<Cookie>()

告诉我此代码是否有改进。再次感谢!

【问题讨论】:

  • 您是否尝试过使用 Fiddler 之类的工具从 Java 代码中捕获工作跟踪,并从您的代码中捕获非工作跟踪以查看差异?另外-您的代码中的request 是什么?你能举一个更完整的例子吗?
  • @BrianReischl 发布了更多代码。我会和 fiddler 一起看看,看看我可能缺少什么。
  • 假设您的用户名和密码正确,您的任何尝试都应该有效。希望 Fiddler 能提供更多信息。
  • 您确定它使用的是基本身份验证,而不是基于表单的自定义身份验证吗?
  • @jvenema API 的开发者告诉我这是基本的身份验证。我有一个他们提供的用户名/密码,用于登录他们的 api 并访问它。

标签: c# asp.net-mvc rest


【解决方案1】:
public void SetBasicAuthHeader(WebRequest req, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    req.Headers["Authorization"] = "Basic " + authInfo;
}

来自:http://blog.kowalczyk.info/article/at3/Forcing-basic-http-authentication-for-HttpWebReq.html

编辑:基于评论。

HttpRequestMessage requestMsg = new HttpRequestMessage();
string data = username + ":" + password;
requestMsg.Headers.Authorization = new AuthenticationHeaderValue("Basic", data);

【讨论】:

  • 这基本上是我已经在做的(见编辑),但它似乎没有工作。
  • 编码类型有所不同。请求的编码是什么与您明确设置 ASCII...
  • 两种方法我都试过了。到目前为止,它似乎没有什么不同。凭据是正确的,我很确定。
  • 啊哈! .Net 4.5 的新手msdn.microsoft.com/en-us/library/hh137974(v=vs.110).aspx 他们更新了它,可能是因为它很难使用。免责声明:我已经在自制的 OAuth 中使用了它,并且我假设它也适用于 Basic。请参阅帖子进行编辑。
  • @BrianP 这让我走上了正轨。我开始查找这个新对象并意识到它需要不同的对象并完全设置。把它放在一起后,我得到了一个成功的响应以及我期望的 cookie。我会将更改添加到我的帖子中并标记您的答案。谢谢!
猜你喜欢
  • 2019-05-08
  • 2020-03-10
  • 1970-01-01
  • 2022-06-26
  • 2013-01-05
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多