2017-02-13 1 views
0

J'utilise l'authentification basée sur un jeton OAuth dans mon projet basé sur api Web.comment instancier cet objet dans Startup.cs

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin"); 

     if (allowedOrigin == null) allowedOrigin = "*"; 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin }); 

     //At this line, I am getting Error Object reference not set. 
     if (_membershipService.ValidateUser(context.UserName.Trim(), context.Password.Trim())) 
     { 
      var user = _membershipService.GetUser(context.UserName); 

      /* db based authenication*/ 
      var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
      identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
      identity.AddClaim(new Claim(ClaimTypes.Role, "user")); 
      identity.AddClaim(new Claim("sub", context.UserName)); 

      var props = new AuthenticationProperties(new Dictionary<string, string> 
      { 
       { 
        "as:client_id", (context.ClientId == null) ? string.Empty : context.ClientId 
       }, 
       { 
        "userName", user.Email 
       }, 
       { 
        "role", (user.Role).ToString() 
       } 
      }); 

      var ticket = new AuthenticationTicket(identity, props); 
      context.Validated(ticket); 
     } 
     else 
     { 
      context.Rejected(); 
     } 


    } 

En appelant _membershipService.ValidateUser(), j'obtiens une référence d'objet non définie. Ce qui est assez évident. Donc, pour corriger cette erreur, j'ai défini le constructeur comme suit:

public SimpleAuthorizationServerProvider(IMembershipService membershipService) 
    { 
     _membershipService = membershipService; 
    } 

Et en appelant la méthode, je passe la référence.

Startup.cs

public void ConfigureOAuth(IAppBuilder app) 
    { 
     OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 
     OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      //passing the membership object. 
      Provider = new SimpleAuthorizationServerProvider(_membershipService), 

     }; 

     // Token Generation 
     app.UseOAuthAuthorizationServer(OAuthServerOptions); 
     //Token Consumption 
     app.UseOAuthBearerAuthentication(OAuthBearerOptions); 




    } 

Référence d'objet non définie à une instance d'un objet.

J'ai donc essayé de surcharger constructeur de Startup.cs comme ci-dessous:

public Startup(IMembershipservice membership) 
{ 
    _membership = membership; 
} 

Mais cela jette l'erreur de l'exécution ci-dessous

Aucun constructeur défini pour parameterless cet objet.

Startup.cs

public Startup() 
    { 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     RegisterIOC(); 
    } 
private void RegisterIOC() 
    { 
     container = new WindsorContainer(); 
     container.Register(Component.For<SimpleAuthorizationServerProvider>().LifestyleTransient()); 
    //rest of the stuff 
    } 

Comment puis-je instanitate la classe d'appartenance.

(Veuillez noter que j'utilise Castle Windsor DI Container).

Toute aide ou suggestion très appréciée. Merci.

Répondre

1

Vous dites que vous utilisez le conteneur Windsor Windsor DI, mais aucun code n'initialise le conteneur dans la classe Startup.cs. Si vous utilisez OWIN (classe Startup.cs), vous n'avez pas besoin de l'initialisation de l'application dans la méthode Global.asax Application_Start. Vous devez déplacer l'initialisation du conteneur vers la classe Startup.cs et résoudre l'instance IMembershipservice après l'initialisation. Quelque chose comme ceci:

public void Configuration(IAppBuilder app) 
    { 

     var container = new WindsorContainer().Install(new WindsorInstaller()); 
     container.Register(Component.For<IAppBuilder>().Instance(app)); 
     var httpDependencyResolver = new WindsorHttpDependencyResolver(container); 

     HttpConfiguration config = new HttpConfiguration(); 
     config.MapHttpAttributeRoutes(); 

     config.DependencyResolver = httpDependencyResolver; 
     GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorControllerActivator(container)); 


     app.UseWebApi(config); 
    } 

Ensuite, vous pouvez utiliser le conteneur pour résoudre l'instance de votre classe.

+0

DI stuff est dans un endroit séparé et j'ai revérifié, tout ce mapping sont en place. Mais toujours l'erreur persiste –

+0

"DI stuff est à un endroit séparé" <- c'est la raison d'une erreur. Startup.cs devrait contenir l'initialisation DI. Ensuite, vous avez conteneur dans votre classe Startup.cs et peut résoudre votre type. – Salkony

+0

Mais pourquoi erreur pour seulement cette classe. –