c# - 使用依赖注入(inject)统一配置的简单授权服务提供者

标签 c# asp.net-web-api dependency-injection asp.net-web-api2 unity-container

我正在开发一个应用程序,我想使用依赖注入(inject)将 IAuthrepository 注入(inject) SimplerAuthorizationServiceProvider 中。但是当我运行该应用程序时,它返回空异常。这是我的代码。

public void Configuration(IAppBuilder app)
{
    // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888

    HttpConfiguration config = new HttpConfiguration();
    UnityConfig.Register(config);
    WebApiConfig.Register(config);
    ConfigureOAuth(app);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);
}

public void ConfigureOAuth(IAppBuilder app)
{
    OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
    {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/api/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
        Provider = new SimpleAuthorizationServerProvider((IAuthRepository)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IAuthRepository)))
    };
    app.UseOAuthAuthorizationServer(OAuthServerOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

}

这是 SimpleAuthorizationServiceProvider 类

    public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {
        private IAuthRepository _repo;
        public SimpleAuthorizationServerProvider(IAuthRepository repo)
        {
            _repo = repo;
        }
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            if (context.ClientId == null)
            {
                context.Validated();
            }
        }
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            try
            {
                context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
                IdentityUser user = await _repo.FindUser(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);

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }
}

当我运行应用程序时,_repo始终为空,因此它给了我空异常。这里正在注册存储库。

public static void Register(HttpConfiguration config)
        {
            var container = new UnityContainer();
            container.RegisterType<IAuthRepository, AuthRepository>(new HierarchicalLifetimeManager());
            config.DependencyResolver = new UnityResolver(container);
        }

最佳答案

您尝试从静态GlobalConfiguration解析,但用于注册依赖项的HttpConfiguration是您在Configuration方法中手动创建的实例

重构以使用本地配置实例

public void Configuration(IAppBuilder app) {    
    HttpConfiguration config = new HttpConfiguration();
    UnityConfig.Register(config);
    WebApiConfig.Register(config);
    ConfigureOAuth(app, config.DependencyResolver);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);
}

public void ConfigureOAuth(IAppBuilder app, IDependencyResolver resolver) {
    OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/api/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
        Provider = new SimpleAuthorizationServerProvider((IAuthRepository)resolver.GetService(typeof(IAuthRepository)))
    };
    app.UseOAuthAuthorizationServer(OAuthServerOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());    
}

关于c# - 使用依赖注入(inject)统一配置的简单授权服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53301045/

相关文章:

c# - UWP:SignTool错误:访问被拒绝。 (解决!)

c# - 404 拒绝 UrlScan 删除请求

c# - MVC 4 WebAPI 对不可为空类型的验证

asp.net-web-api - Blazor API 项目可以与客户端共享相同的本地主机端点吗?

AngularJS 和 Typescript - 注入(inject)其他服务的服务未定义

c# - Specflow - 使用来自 .NET Core 的 Microsoft 依赖注入(inject)导致 BoDi.ObjectContainerException

c# - 资源池 'default' 中的系统内存不足,无法运行此查询。在 SQL 上

c# - Ninject + 自动发现

c# - ASP.NET Core 类型化客户端中的 IHttpClientFactory

c# - 为什么我不能在C#中另一个类的DateTime对象上调用DateTime方法