2016-09-27 94 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上打我。