1

У меня возникли проблемы неприятности с вебом-апите 2.Получить доступ Токен Asp.NET Web Api 2

Я использую vs2015 и разработал свой проект на ASP.NET MVC единого шаблона страницы, которые используют нокаут и Сэме получить/авторизировать идентификацию через owin промежуточное ПО.

Когда я запрашиваю токен доступа по умолчанию для одной страницы app.js, это работает хорошо, но если я попытаюсь получить токен через почтальон (grant_type=password&[email protected]&password=1234), который возвращает ошибку invalid_cliend.

{ 
    "error": "invalid_client" 
} 

Поставщик:

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 
    { 
     private readonly string _publicClientId; 

     public ApplicationOAuthProvider(string publicClientId) 
     { 
      if (publicClientId == null) 
      { 
       throw new ArgumentNullException("publicClientId"); 
      } 

      _publicClientId = publicClientId; 
     } 

     public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) 
     { 
      if (context.ClientId == _publicClientId) 
      { 
       Uri expectedRootUri = new Uri(context.Request.Uri, "/"); 

       if (expectedRootUri.AbsoluteUri == context.RedirectUri) 
       { 
        context.Validated(); 
       } 
       else if (context.ClientId == "web") 
       { 
        var expectedUri = new Uri(context.Request.Uri, "/"); 
        context.Validated(expectedUri.AbsoluteUri); 
       } 
      } 

      return Task.FromResult<object>(null); 
     } 

    } 

Startup.Auth:

static Startup() 
     { 
      PublicClientId = "web"; 

      OAuthOptions = new OAuthAuthorizationServerOptions 
      { 
       TokenEndpointPath = new PathString("/Token"), 
       AuthorizeEndpointPath = new PathString("/Account/Authorize"), 
       Provider = new ApplicationOAuthProvider(PublicClientId), 
       //Provider = new AuthorizationServerProvider(), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
       AllowInsecureHttp = true 
      }; 
     } 

     public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

     public static string PublicClientId { get; private set; } 

мне нужна ваша помощь.

+0

Убедитесь, что вы отправки 'grant_type = пароль & имя = админ @ mail.com и пароль = 1234' в теле запроса. Как вы составляете свой запрос в почтальоне? Возможно, вы можете использовать 'Fiddler' для перехвата запроса из вашего' app.js' (который, как вы говорите, работает нормально), чтобы увидеть, как он отправляется, а затем сравнивается. –

+0

Перейдите на вкладку «Тело» -> установите флажок «x-www-form-urlencoded» и передайте имя_данных, имя пользователя и пароль в качестве пары ключ/значение. – tsubasaetkisi

ответ

0

Я думаю, что вы должны переопределить ValidateClientAuthentication вместо ValidateClientRedirectUri, если хотите использовать грант типа password (grant_type = password).

public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
{ 
    //here simply call context.Validated() or add your client id validation logic 

} 
+0

Точно! Спасибо за ответ. – tsubasaetkisi

0

Раствор для других:

public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
{ 
    context.Validated(); 
} 

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

    //validate to get access_token 
    if (context.UserName == "[email protected]" && context.Password == "1234") 
    { 
     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 


     identity.AddClaim(new Claim("sub", context.UserName)); 
     identity.AddClaim(new Claim("role", "user")); 

     context.Validated(identity); 
    } 
    else 
    { 
     context.SetError("invalid_grant", "Invalid username or password."); 
    } 
} 

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

  • Нет связанных вопросов^_^