【发布时间】:2014-09-23 14:22:29
【问题描述】:
刚接触依赖注入,所以这可能是一个简单的问题,但我已经尝试过但无法弄清楚,我正在使用简单注入器。
我有一个使用 SimpleInjector 的 WebApi 非常好,现在我想使用 OAuth 实现安全性。
为此,我开始遵循本教程,这非常有帮助,但不使用依赖注入
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
我的 global.asax 文件看起来像这样,用于设置依赖注入(完美运行)
protected void Application_Start()
{
SimpleInjectorConfig.Register();
GlobalConfiguration.Configure(WebApiConfig.Register);
}
我创建了一个 Startup.Auth.cs 文件来配置 OAuth
public class Startup
{
public void Configuration(IAppBuilder app)
{
var OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new MyAuthorizationServerProvider() // here is the problem
};
// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
现在正如我上面评论的那样,MyAuthorizationServerProvider 是问题所在。它需要一个我通常注入的 IUserService 参数。我不想清空构造函数,因为我的 IUserService 也注入了一个存储库。这是文件
public class ApiAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
private IUserService _service;
public ApiAuthorizationServerProvider (IUserService service)
{
_service = service;
}
public override async Task ValidateClientAuthentication(
OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(
OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin",
new[] { "*" });
IUserService service = Startup.Container.GetInstance<IUserService>();
User user = _service.Query(e => e.Email.Equals(context.UserName) &&
e.Password.Equals(context.Password)).FirstOrDefault();
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);
}
}
如何使用依赖注入来实现这一点?这一定会发生很多,并且必须能够做一些事情来处理它。我确信它很简单,但我仍在学习。
【问题讨论】:
-
您找到其他解决方案了吗?
-
我使用来自 github 的 OpenIddict 并且仅将角色名称存储为声明。不存储权限,因为如果更新了某些内容,则更改会立即在服务器上。每个请求我只需要检查一次权限,所以这对我来说很好
标签: c# asp.net asp.net-mvc dependency-injection simple-injector