2015-06-03 3 views
2

У меня есть веб-Апи с маршрутом к установке Войти лексемы в Startup.Auth как так:PostAsync к/Токен возвращается Внутренняя ошибка сервера

 PublicClientId = "self"; 
     OAuthOptions = new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider(PublicClientId), 
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
      AllowInsecureHttp = false 
     }; 

Это должно маршрут мой апи запрос Войти сюда:

[OverrideAuthentication] 
    [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
    [AllowAnonymous] 
    [Route("ExternalLogin", Name = "ExternalLogin")] 
    public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null) 
    { 
    Authorize stuff... 
    } 

От моего клиента я пытаюсь войти в систему и получить маркер доступа:

 var loginResponse = await client.PostAsync("/Token", loginContent); 

Использование входа Conte нт:

 var values = new Dictionary<string, string>(); 
     values.Add("grant_type", "password"); 
     values.Add("username", "usernamehere"); 
     values.Add("password", "passwordhere"); 
     var loginContent = new FormUrlEncodedContent(values); 

Когда я пытаюсь войти в PostAsync к/Знаку, чтобы получить access_token назад я всегда получаю Внутреннюю ошибку сервера. Я даже не могу войти в api, чтобы посмотреть, что происходит.

Если удалить [Авторизовать] украшение из методов API, я могу получить мои данные обратно ... Я просто не могу войти.

Если я иду в браузер и положить следующее в url to test ...

https://localhost:44305/Token 

Я получаю (400) плохую просьбу. Не уверен, что попробовать дальше.

Мне нужно, чтобы Token Auth работал ... не может публиковать без обеспечения. ;)

Update:

Я хотел бы добавить, что я использую пользовательский UserStore для идентичности.

Обновление 2: Клиент

public static HttpClient GetClient() 
    { 

     HttpClient Client = new HttpClient(); 

     Client.BaseAddress = new Uri(Ics2Constants.ICS2APIBaseAddress); 
     Client.DefaultRequestHeaders.Accept.Clear(); 
     Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     return Client; 
    } 

Затем с помощью:

using (var client = ICS2HttpClient.GetClient()) 
     { 
      //TESTING: 
      await ICS2HttpClient.Authenticate(client); 

      //... more stuff after authentication 
     } 

Аутентифицировать содержит PostAsync ...

+0

Можете ли вы добавить код, в котором вы создаете экземпляр клиента? – ajliptak

+0

Ну, я чувствую себя немым.Я должен был смотреть на GrantResourceOwnerCredentials для запроса Token. У меня была некоторая логика, которую нужно было обновить на основе моей индивидуальной идентификации ... старая логика потерпела неудачу и вернула внутреннюю ошибку сервера ... ExternalLogin было неправильным местом для поиска. – pStan

ответ

0

На всякий случай кто-то делает те же глупые ошибки, что и я:

GrantResourceOwnerCredentials - это место, куда направляется маршрут/токен при проверке пользователя/пароля и выдаче токена доступа.

В моем случае код ниже находится в каталоге провайдеров в ApplicationOAuthProvider.cs

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 
{ 
    private readonly string _publicClientId; 

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

     _publicClientId = publicClientId; 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     // use the userManager to find the user, check credentials, grab roles, etc. 
    } 

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

Еще одно примечание. Я написал собственный материал Identity на основе идентификационных данных mySQL here

0
атрибут

Авторизоваться не должны быть размещены над любым методом получение токена должно быть анонимным

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