2015-08-12 9 views
2

Так что я пытаюсь реализовать очень простой сервер авторизации oauth в ASP.NET с использованием OWIN.ArgumentNullException, возникающий при попытке запросить токен аутентификации

Вот мой источник:

public class AuthorizationConfig { 
     private const string WebClientId = "WebClient"; 
     private const string WebClientSecret = "WebClientSecret"; 

     public static void Configure(IAppBuilder app) { 
      app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions() { 
       TokenEndpointPath = new PathString("/token"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromHours(8), 
       AllowInsecureHttp = true, 
       Provider = new OAuthAuthorizationServerProvider() { 
        OnValidateClientAuthentication = context => { 
         string clientId; 
         string clientSecret; 

         if (context.TryGetBasicCredentials(out clientId, out clientSecret)) 
         { 
          if (clientId == WebClientId && clientSecret == WebClientSecret) 
          { 
           return Task.FromResult(context.Validated(clientId)); 
          } 
         } 

         context.SetError("invalid_client", "Client credentials provided are invalid."); 
         return Task.FromResult<object>(null); 
        }, 

        OnGrantResourceOwnerCredentials = context => { 
         var userName = context.UserName; 
         var password = context.Password; 
         var clientId = context.ClientId; 

         //validate resource owner credentials 
         if (userName == "admin" && password == "password" && clientId == WebClientId) 
         { 
          var identity = new ClaimsIdentity(); 
          identity.AddClaim(new Claim("username", userName)); 
          identity.AddClaim(new Claim("clientId", clientId)); 

          return Task.FromResult(context.Validated(identity)); 
         } 

         context.SetError("invalid_grant", "Resource owner credentials are invalid."); 
         return Task.FromResult<object>(null); 
        } 
       } 
      }); 

      app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
     } 
    } 

Теперь каждый раз, когда я пытаюсь отправить почту на мой хост/маркер, можно увидеть при отладке, что код успешно выполняет методы context.Validated но ответа возврата, Я получаю ArgumentNullException: Value. Кто-нибудь еще с этим вопросом?

EDIT: Вот StackTrace я получаю

[ArgumentNullException: Value cannot be null. 
Parameter name: value] 
    System.IO.BinaryWriter.Write(String value) +11937097 
    Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer.Write(BinaryWriter writer, AuthenticationTicket model) +97 
    Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer.Serialize(AuthenticationTicket model) +161 
    Microsoft.Owin.Security.DataHandler.SecureDataFormat`1.Protect(TData data) +45 
    Microsoft.Owin.Security.Infrastructure.AuthenticationTokenCreateContext.SerializeTicket() +16 
    Microsoft.Owin.Security.OAuth.<InvokeTokenEndpointAsync>d__22.MoveNext() +4114 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) +25 
    Microsoft.Owin.Security.OAuth.<InvokeAsync>d__0.MoveNext() +1109 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Security.Infrastructure.<Invoke>d__0.MoveNext() +383 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +187 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Security.Infrastructure.<Invoke>d__0.MoveNext() +561 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +187 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<DoFinalWork>d__2.MoveNext() +185 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +69 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +64 
    System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +380 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

ответ

6

Ну, я решил эту проблему путем инициализации ClaimsIdentity с AuthenticationType. Не уверен, как именно это разрешает трассировку стека, но я больше не получаю ошибки времени выполнения.

+0

КАК ВЫ СДЕЛАЛИ ЭТО? – curiousity

+0

@curiousity Я подтверждаю, что он решил это для меня. – shturm

+0

Как вы это сделали? Любой пример? – xrklvs

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

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