Xamarin.Essentials WebAuthenticator 服务器端实现重定向到登录页面而不是 401?

Xamarin.Essentials WebAuthenticator server side implementation redirects to login page instead of 401?

我正在尝试理解 WebAuthenticator 文档和示例。我的目标是在应用程序中使用基于服务器的社交登录 (oauth 2)。

使用此实现时,必须假设我在另一个控制器中可以使用 [Authorize] 属性来要求身份验证。但是当我这样做时发生的是它试图重定向到 /Account/Login 而这又不存在,给出 404.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Sample.Server.WebAuthenticator.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class SampleController : ControllerBase
    {
        // GET: api/Sample
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

因此,尝试 Android 模拟器中的概念会导致 api 控制器 url "not being found" aka 404,而不是像 401 那样需要某种身份验证。

要对此进行测试,请从上面下载 Xamarin essentials 示例。使用 API read/write 模板添加一个 SampleController。构建Sample.Server.WebAuthenticator,将其设置为唯一的启动项目并进行调试。 确保您可以访问 /api/sample 并收到 json 结果。 接下来将 [Authorize] 添加到 SampleController,并对其进行调试。 它将重定向到丢失的登录页面。

我有点困惑,服务器示例不像 Jwt article from wildermuth

那样工作

通知应用它应该进行身份验证的正确方法是什么?

您需要从 SampleController 控制器 class 中取出 [Authorize] 属性,或者添加 [AllowAnonymous] 属性以允许从应用程序访问它而不用需要先通过登录页面进行身份验证。

该示例并非旨在针对服务器进行身份验证,即使它看起来像。目的是针对 google 进行身份验证。然后可以在 api 对 google 的调用中使用令牌。没有其他的。即使加了Jwt认证,token也不能用于自己的网站API.

因此,为了对自己的网站进行社交身份验证 API,必须使用能够联合的解决方案,例如 IdentityServer4。 ID4 将取代示例服务器,并且在对社交提供商进行身份验证后,它会发出自己的令牌,应用程序可以使用该令牌对自己的网络进行身份验证 API.

在路由到 /signin-microsoft:

时,在示例服务器中验证 Microsoft 帐户时返回以下错误

异常:OAuth 令牌端点失败:状态:BadRequest;Headers:Cache-Control:no-store,no-cache