javascript - 如何使用外部登录从 Web API 2 获取 token

标签 javascript ajax asp.net-mvc-5 asp.net-web-api2 token

我有网站和 WebAPI 2 ( ASP.NET MVC 5 ) 托管在本地主机上,但端口不同。

我尝试使用此 JavaScript 获取 token ,但根本没有 token ,它会重定向到当前网站,查询字符串包含用户名和密码。

如何解决?

 <form id="userData">
        <input type="text" name="userName" placeholder="UserName" />
        <input type="text" name="password" placeholder="Password" />
        <input type="submit" id="login" value="Login" />
 </form>

var login = function () {

  var loginData= $("#userData").serialize();
  loginData= loginData+ "&grant_type=password";

  $.ajax({
    type: 'POST',
    url: 'http://localhost:57371/Token',
    data: loginData
  }).done(function (data) {
    console.log(data);
    // Cache the access token in session storage.
    sessionStorage.setItem(tokenKey, data.access_token);
  }).fail(showError);

   return false;
};

$("#login").click(login);

var showError = function (XMLHttpRequest, textStatus, errorThrown) {
   var responseText = JSON.parse(XMLHttpRequest.responseText)
   console.log(responseText.Message + " Code: " + XMLHttpRequest.status);
   $("#output").text(JSON.stringify(responseText, null, 4));
};

更新 1. Cors 已启用。

public static void Register(HttpConfiguration config)
{
   EnableCrossSiteRequests(config);
}
private static void EnableCrossSiteRequests(HttpConfiguration config)
        {
            var cors = new EnableCorsAttribute(
                origins: "*",
                headers: "*",
                methods: "*");
            config.EnableCors(cors);
        }

更新 2. 错误

enter image description here

最佳答案

确保在订阅登录按钮的 click 事件之前等待 DOM 加载:

$(function() {
    $("#login").click(login);
});

此外,我建议您订阅表单的 submit 事件,而不是提交按钮的 click 事件,因为可以通过以下方式提交表单:用户按下 Enter 键,而焦点位于文本框内,并且没有单击任何按钮,因此错过了 AJAX 调用:

$(function() {
    $('#userData').submit(login);
});

这将保证无论此表单如何提交,您的 AJAX 调用都将执行,而不是简单地重新加载当前页面并将用户名和密码作为查询字符串参数附加到其中(这是您目前观察到的行为) )。

<小时/>

更新:

看来您的 Web API 根本不允许 CORS,因此请求被阻止。

您可以查看following article用于在 Web API 中启用 CORS。

关于javascript - 如何使用外部登录从 Web API 2 获取 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41571921/

相关文章:

javascript - Vue js 与 jquery get 的问题

entity-framework - 将 Entity Framework 与 cassandra 数据库结合使用

asp.net - 使用 LINQ 和 Entity Framework 出现错误 "No best type found for implicitly-typed array"

javascript - 修复了对 slickgrid 进行排序时底部的一行

javascript - 有没有办法创建变量的名称并从循环中进行更改?

javascript - 如何将图像放入数组中

c# - 如何调用global.asax中的 Controller 方法?

使用单选按钮计算 Javascript/HTML5 问题

javascript - Bootstrap 选项卡上的 MVC 单击重新加载 Controller 并刷新

c# - 如何在不更改 maxJsonLength 的情况下发送大型/多部分 JSON 对象?