【问题标题】:.Net MVC 6 Authorization from desktop app来自桌面应用程序的 .Net MVC 6 授权
【发布时间】:2016-08-12 16:36:24
【问题描述】:

使用项目模板中的样板代码,我创建了一个带有登录名的 .net core mvc6 webapp。

登录控制器是:

 // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)

LoginViewModel 是:

 public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

我可以从登录网页登录。

我想通过桌面 .net c# 程序在此项目中使用具有 [Authorization] 属性的控制器(作为 API)。为此,我计划从登录控制器获取 cookie 并使用 cookie 访问 API。

桌面软件获取 cookie 的代码是(复制粘贴表单 StackOverflow 并添加 JSON 序列化):

      private void btnLogin_Click(object sender, EventArgs e)
    {
        HttpWebRequest http = WebRequest.Create(loginUrl) as HttpWebRequest;
        http.KeepAlive = true;
        http.Method = "POST";
        http.ContentType = "application/x-www-form-urlencoded";

        var login = new LoginViewModel();
        login.Email = txtUserName.Text;
        login.Password = txtPassword.Text;
        var postData = new JavaScriptSerializer().Serialize(login);

        byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
        http.ContentLength = dataBytes.Length;

        using (Stream postStream = http.GetRequestStream())
        {
            postStream.Write(dataBytes, 0, dataBytes.Length);
        }
        HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

//HTTP 400 在这里停止

        // Probably want to inspect the http.Headers here first
        http = WebRequest.Create(authorized) as HttpWebRequest;
        http.CookieContainer = new CookieContainer();
        http.CookieContainer.Add(httpResponse.Cookies);
        HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;
    }

LoginViewModel 类具有与 web 应用程序相同的属性。

不幸的是它不起作用,HTTP 响应是 400。

问题:

  1. 我的逻辑正常吗?如果是,你能指出代码哪里错了吗?

  2. 基于 cookie 的身份验证是否可以访问 Restful web api?

  3. 考虑到它将是 HTTPS,它能否用于流量较低的 Web 服务?

  4. 如果没有像 strompath 或 auth0 这样的第三方提供商,有没有更好的方法?

【问题讨论】:

    标签: .net cookies authorization asp.net-core-mvc


    【解决方案1】:

    我的逻辑可以吗?如果是,你能指出代码哪里错了吗?

    如果您的 API 需要 JSON 格式的数据,那么您可能需要适当地设置 ContentType 标头:

    http.ContentType = "application/json";
    

    (如果您仍然收到400 作为状态码,请检查响应以获取来自 API 的关于您发送错误内容的任何提示)。

    基于 cookie 的身份验证是否可以访问 Restful web api?

    这是可能的,但可能不是最好的方法,特别是对于非浏览器客户端。 如今,访问安全 API 的一种流行选择是通过不记名令牌。您从身份提供者端点(您的应用程序或第三方提供者,例如 Auth0 或 StormPath)获取令牌,并将该令牌包含在对 API 的每个请求的 Authorization 标头中。有关这方面的一些讨论,请参阅 https://auth0.com/blog/cookies-vs-tokens-definitive-guide/

    您的 API 必须准备好接受不记名令牌作为授权访问的替代方式。对于 .Net Core,一些中间件会检查 HTTP 标头中的传入令牌,对其进行验证,然后设置 ClaimsPrincipal 以便您的 Authorize 属性继续按预期工作。

    通常令牌是JWTs (Json Web Tokens),可以检查和调试(它们已签名,未加密),这是使用 cookie 更好的体验。例如,您可以查看令牌以查看它是否已过期并获取新令牌,从而避免 API 出错。

    考虑到它将是 HTTPS,它可以用于低流量的 Web 服务吗?

    可以,但同样,只有在您无法控制 API 以添加对令牌的支持时才能这样做。

    如果没有像 strompath 或 auth0 这样的第三方提供商,有没有更好的方法来做到这一点?

    JWT 格式是开放且标准的。您可能会生成您自己的并从您需要构建的身份验证 API 中返回它们(这将返回令牌而不是会话 cookie)。

    在您拥有 JWT 后,Microsoft 会提供一个包来帮助您使用 JWT 令牌保护您的 API:

    Install-Package Microsoft.AspNetCore.Authentication.Jwt
    

    然而,身份验证很容易出错。这就是 Stormpath 或 Auth0 等 3rd 方提供者真正派上用场的地方。免责声明:我为 Auth0 工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 2021-12-04
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      相关资源
      最近更新 更多