401在ASP.NET 5中使用通用OAuth中间件时未经授权

本文关键字:中间件 OAuth 授权 NET ASP | 更新日期: 2023-09-27 18:29:01

我正试图使用ASP.NET 5(rc1最终版本)、Identity和MS.AspNet.Authentication.OAuth中间件将我正在构建的网站连接到FitBit。我打算使用OAuth 2.0的授权授予流。我在FitBit上设置了应用程序(详细信息如下),我的Startup.cs看起来像:

app.UseIdentity();
app.UseOAuthAuthentication(options =>
    {
        options.AuthenticationScheme = "FitBit-AccessToken";
        options.AuthorizationEndpoint = "https://www.fitbit.com/oauth2/authorize";
        options.TokenEndpoint = "https://api.fitbit.com/oauth2/token";
        options.SaveTokensAsClaims = true;
        options.CallbackPath = new PathString("/signing-fitbit-token/");
        options.ClientId = "[MY ID STRIPPED OUT]";
        options.ClientSecret = "[MY SECRET STRIPPED OUT]";
        options.DisplayName = "FitBit";
        options.Scope.Add("activity");
        options.Scope.Add("heartrate");
        options.Scope.Add("location");
        options.Scope.Add("nutrition");
        options.Scope.Add("profile");
        options.Scope.Add("settings");
        options.Scope.Add("sleep");
        options.Scope.Add("social");
        options.Scope.Add("weight");
        options.AutomaticAuthenticate = true;
    });

当我单击登录按钮时,我将被引导到FitBit上的授权页面,但当我单击授权时,我会看到ASP.NET开发错误页面:

An unhandeled exception occurred while processing the request.
HttpRequestException: Response status code does not indicate success: 401 (Unauthorized)
     System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()

我在这里读到,对于一些OAuth端点(即Yahoo),他们不喜欢localhost。因此,我尝试了使用localhost和将主机文件修改到不同的域。我已经确保我传递的重定向url是在FitBit为应用程序注册的url。

这个错误来自我的网站,并且已经到了将代码交换为访问令牌的地步。我有小提琴手,我有点不知所措,不知道从这里往哪里走。我在http上运行(因为这是本地开发,我还没有ssl证书),但我不完全确定这是否重要。

401在ASP.NET 5中使用通用OAuth中间件时未经授权

默认情况下,OAuth2通用中间件通过在请求表单中流动客户端凭据(使用application/x-www-form-urlencoded编码)来发送客户端凭据。

遗憾的是,Fitbit只支持基本身份验证:由于凭证没有在Authorization标头中流动,Fitbit将您的令牌请求视为未经身份验证并拒绝它。

幸运的是,这是专门的Fitbit社交提供商(内部基于OAuth2通用中间件)将为您处理的事情:https://www.nuget.org/packages/AspNet.Security.OAuth.Fitbit/1.0.0-alpha3

app.UseFitbitAuthentication(options => {
    options.ClientId = "230H9";
    options.ClientSecret = "ae7ff202cg5z42d85a3041fdc43c9c0b2";
});

对FitBit的OAuth请求出现问题,您需要调试该请求,并查看为什么从FitBit返回401。