c# - 在 ASP.NET 5 中使用通用 OAuth 中间件时出现 401 未经授权

标签 c# asp.net oauth asp.net-core fitbit

我正在尝试使用 ASP.NET 5 (rc1-final)、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()

我确实读过here对于某些 OAuth 端点(即 Yahoo),他们不喜欢 localhost。因此,我尝试使用本地主机,并将主机文件修改为不同的域。我已确保我传入的重定向网址是在 FitBit 上为应用程序注册的网址。

此错误来 self 的网站,并且已达到将代码交换为访问 token 的程度。我打开了 fiddle 手,我有点迷失了从这里去哪里。我正在 http 上运行(因为这是本地开发,而且我还没有 ssl 证书),但我不完全确定这是否重要。

最佳答案

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

遗憾的是,Fitbit 仅支持基本身份验证:由于凭据未在 Authorization header 中流动,Fitbit 将您的 token 请求视为未经身份验证并拒绝它。

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

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

关于c# - 在 ASP.NET 5 中使用通用 OAuth 中间件时出现 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34615749/

相关文章:

c# - 在文本框中写入的阅读路径删除反斜杠

asp.net - 在后面的代码中编写查询与 SqlDataSource

Android oAuth 刷新 token 返回 null

java - Spring Security OAuth2 cookie

ASP.NET 对象缓存 - 多少才算太多?

Android Tumblr Oauth 路标 401

c# - StackExchange.Redis在redis集群模式下有什么用

c# - 基类中的属性未出现在 View 模型中

c# - Xamarin.Forms:如何使用相对布局使 View 居中? `Width` 和 `Height` 返回 -1

C# Json 字符串的等效类