【问题标题】:Getting Authorization has been denied for this request已拒绝为此请求获取授权
【发布时间】:2017-02-04 18:00:47
【问题描述】:

我已将我的 Web API 2 项目配置为使用 OWIN 使用 OAuth

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureOAuth(app);

            HttpConfiguration config = new HttpConfiguration();
            WebApiConfig.Register(config);
            app.UseWebApi(config);
        }

        public void ConfigureOAuth(IAppBuilder app)
        {

            OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {

                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                Provider = new MyAuthorizationServerProvider()
            };

            // Token Generation
            app.UseOAuthAuthorizationServer(OAuthServerOptions);

            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

        }

    }

MyAuthorizationServerProvider 的实现:

public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var repo = new AuthRepository();
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        var user = repo.ValidateUserCredentials(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role", "user"));

        context.Validated(identity);
    }
}

我可以得到一个令牌.. 然后我将它发送到一个用[Authorized] 装饰的控制器并且仍然得到

{
  "message": "Authorization has been denied for this request."
}

这里带有token的请求头:

Content-Type:application/json
Authorization:Bearer m6ukGHOmp_MgM6rsb70n8Rd_BlBEXbgyPNr5ZNzGzkm__7zdntVPYAMAhFPXVdw1S6-ohv960c6mzMMwkY0G_AL-2uIq2aOjkoojxDPKuITuml8sgC4ng0KC2AqUFrBBEn0eCsSAnc3UK_jyKSB59Ao_eL9JPoJHoJHP-xBs42KGAGl4iKdYtzdfg2zY0Ucif_IpPH3Gbvs6iyLVMf0jlKgj4EOBtrDHanikeqkWc0W2pWjIIac8cyUrOtZCj7h3

我在这里做错了什么?

还有 .. 想知道 .. 令牌存储在哪里? Web API 如何验证接收到的令牌是否附加到相关用户?

我是否缺少某些令牌存储类的自定义实现?如果是这样,我在哪里可以找到有关如何实现自定义令牌存储的信息?

【问题讨论】:

    标签: c# asp.net-web-api oauth asp.net-web-api2 owin


    【解决方案1】:

    令牌不存储在任何地方,它只是一个编码的数据位,当您在另一端收到它时,您可以从中提取信息。

    验证发生在 ValidateClientAuthentication 方法中。您刚刚将上下文设置为已验证,根本不进行任何检查。这是您检查 ClientID / Client Secret 组合是否正确的地方,名称也表明了这一点。你可以在那里添加额外的东西。

    我个人不使用 OAuth2 进行用户级别的身份验证,但如果你需要的话,没有什么能阻止你这样做。我更喜欢保持令牌应用程序相关,而不是用户相关,但这只是我的偏好。

    GrantResourceOwnerCredentials 在 invalid_grant 上设置上下文错误?授权与您尝试通过的用户名/密码无关。您仅在请求令牌时设置 grant_type ,它通常是密码类型。 invalid_grant 表示您正在尝试不同的授权类型,而您的代码根本不清楚。

    您还没有向我们展示您的令牌格式类、您如何创建它、您在其中放入了哪些信息等。

    另外,我注意到你同时使用了一件事

    UseOAuthBearerAuthentication - 带有空选项 并且 使用OAuthAuthorizationServer。

    我认为最后一个应该足够了。我在使用 OAuth2 时使用了 JWT,但看起来您实际上并没有使用它。 老实说,代码看起来有点到处都是。

    我想知道您是否介意使用足够的代码创建一个 repo 来复制问题。

    我今晚会尝试看看,看看我是否可以复制这个问题。欢迎您今天晚些时候在 Twitter 上联系我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多