【问题标题】:WebAPI AuthorizationWebAPI 授权
【发布时间】:2017-05-20 07:54:27
【问题描述】:

我有一个运行 MVC5 WebApi 2 的本地站点。我在那里有默认的 AccountController,我有一个 WebApi 控制器,我用 [Authorize] 属性锁定了,所以我需要登录。我想要做的是首先通过 UWP 连接到它。

默认的登录 POST 方法如下所示:

    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

如果我尝试使用 Postman 发布到该 URL,我会收到关于防伪令牌的错误。只是想知道我需要在 Web Api 2 端和 UWP 端做什么才能让它运行。在 UWP 端,我试图通过登录按钮上的 Windows.Web.Http.HttpClient 进行设置,单击我的 XAML。还没有代码,因为我首先在 Postman 中进行测试,看看我需要做什么才能获得连接。我是否需要在 AccountController 上添加一个绕过防伪令牌并仅在 POST 方法上获取用户名/密码的方法,还是不推荐这样做?

所以我的 UWP 只有一个用户名和密码的文本框,我想通过

连接到我的网络服务器

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    您需要将“RequestVerificationToken”标头添加到邮递员请求中以进行测试。您还需要实现自己的方式来实际从 api 获取令牌以进行测试。类似的东西:

    [HttpPost]
    [AllowAnonymous]
    public IActionResult GetToken()
    {
       string cookieToken, formToken;
       System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken);
       return this.Ok(cookieToken + ":" + formToken);
    }
    

    对于您的应用程序,您需要将 Razors @Html.AntiForgeryToken() 的等效项添加到页面生成中,并确保添加的标头与测试请求中的标头相同。

    【讨论】:

    • 这是一个很好的建议。这是我想到的解决方案。我必须修复 ApplicationOAuthProvider 以接受 API 的凭据和 client_id,这样我就可以直接点击 /Token 而无需通过控制器和 Web 耦合视图。我正在构建 Xamarin 和 UWP 应用程序来连接我的网站,只有在客户端连接时才使用 API 才有意义。
    • 这里是一个堆栈交换,可以找到答案(在另一个问题中,这在当时是一个复杂的问题):stackoverflow.com/questions/43175734/…
    猜你喜欢
    • 2016-05-11
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2014-10-28
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多