2016-09-27 4 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); 
    } 
} 

Я могу получить Token .. , затем я отправлю его на контроллер, украшенный [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 

Что я здесь делаю неправильно?

Также .. интересно .. где хранится токен? как веб-API проверяет полученный токен, прикрепленный к соответствующему пользователю?

У меня отсутствует пользовательская реализация некоторого класса магазина токенов? если да, где я могу найти информацию о том, как реализовать пользовательский магазин токенов?

ответ

0

Токен не хранится нигде, это всего лишь закодированный бит данных, и вы можете извлечь информацию из него, когда получите его с другой стороны.

Проверка выполняется внутри метода ValidateClientAuthentication. Вы просто установили контекст для аутентификации без каких-либо проверок. Здесь вы проверяете правильность комбинации ClientID/Client Secret, это также указывает на имя. Вы можете добавить туда лишний материал.

Я лично не использую OAuth2 для аутентификации на уровне пользователя, но ничто не мешает вам это делать, если это то, что вам нужно. Я предпочитаю поддерживать привязку к токену, а не к пользователю, но это только мои предпочтения.

GrantResourceOwnerCredentials устанавливает ошибку контекста на invalid_grant? Грант не имеет ничего общего с именем пользователя/паролем, который вы пытаетесь пройти. Вы только устанавливаете grant_type, когда запрашиваете токен, и обычно это пароль типа. invalid_grant означает, что вы пытаетесь использовать другой тип гранта, и это совсем не ясно из вашего кода.

Вы также не показали нам свой символический класс формат, как вы создаете его, какую именно информацию вы положили в него, и т.д.

Кроме того, одна вещь, которую я заметил, что вы используете как

UseOAuthBearerAuthentication - с пустыми параметрами , а также UseOAuthAuthorizationServer.

Последним должно быть достаточно, я бы подумал. Я использовал JWT при использовании OAuth2, но это не похоже на то, что вы на самом деле его используете. Код выглядит немного повсюду, если честно.

Интересно, не возражаете ли вы создать репо с достаточным количеством кода для повторения проблемы.

Я постараюсь посмотреть сегодня вечером, посмотреть, могу ли я воспроизвести проблему. Сегодня вы можете нажать меня на Twitter.

Смежные вопросы