2016-09-27 39 views
0

我已经配置我的Web API 2项目通过OAuth合作使用OWIN获得授权已被拒绝了这个请求

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." 
} 

与令牌这里的请求头:

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

我在做什么错在这里?

另外..奇迹..存储的令牌在哪里? Web API如何验证收到的令牌是否附加到有问题的用户?

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

回答

0

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

验证发生在ValidateClientAuthentication方法内部。您只需将上下文设置为无验证即可进行验证。这是您检查ClientID/Client Secret组合是否正确的地方,名称也表示这一点。你可以在那里添加额外的东西。

我个人不会使用OAuth2进行用户级别身份验证,但如果这是您需要的,则无法阻止您这么做。我更愿意保持令牌应用程序相关,而不是与用户有关,但这只是我的偏好。

GrantResourceOwnerCredentials在invalid_grant上设置上下文错误?该赠款与您试图通过的用户名/密码无关。您仅在请求令牌时设置grant_type,而且通常是输入密码。 invalid_grant意味着你正在尝试一种不同的授权类型,并且根本不清楚你的代码。

您还没有告诉我们您的令牌格式类,你如何创建它,你把它,什么信息等

此外,有一两件事我注意到您同时使用

UseOAuthBearerAuthentication - 带有空选项 和 UseOAuthAuthorizationServer。

最后一个应该够了我会想。我在使用OAuth2时使用了JWT,但它看起来并不像实际使用它。 该代码看起来有点在老实的地方。

我不知道你是否介意创建一个只有足够的代码复制问题的回购。

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