我正在mysql后端实现OWIN身份验证,我不认为这是一个问题,因为我的注册工作非常好。我基本上已经解决了this post(即大部分代码都被删除了)。
我也在通过autofac使用DI,因此我更改了一些内容,将依赖项注入SimpleAuthorizationServerProvider
问题
我将grant_type =密码,用户名和密码发布到http://localhost/myappurl/token
,然后我收到“错误”:“invalid_client”。当我尝试调试时没有命中,所以它可能在库中失败而没有得到我自己的代码。有谁知道为什么会这样?
请原谅冗长的代码,我不知道问题出在哪里,所以我发布了我认为相关的所有内容,如果有人需要查看更多代码,请询问。
SimpleAuthorizationServerProvider
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
private readonly IUserService _userService;
public SimpleAuthorizationServerProvider(IUserService userService)
{
_userService = userService;
}
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[] { "*" });
var authenticate = await _userService.FindUser(context.UserName, context.Password);
if (!authenticate)
{
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);
}
}
启动
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
ConfigureOAuth(app, (IOAuthAuthorizationServerProvider)config.DependencyResolver.GetService(typeof(IOAuthAuthorizationServerProvider)));
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app, IOAuthAuthorizationServerProvider provider)
{
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(90),
Provider = provider,
ApplicationCanDisplayErrors=true,
};
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
IocConfig
public static class IocConfig
{
public static void Register(HttpConfiguration config)
{
var builder = new ContainerBuilder();
// Configure the container
// Register individual components
builder.Register(c => new MySQLContext()).As<IMySqlContext>().InstancePerRequest();
builder.RegisterType<SimpleAuthorizationServerProvider>().As<IOAuthAuthorizationServerProvider>();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
答案 0 :(得分:0)
那里有很多代码,因此隔离问题并不容易。作为第一步,请考虑删除Autofac DI的代码,看看是否有任何区别。很难说出问题可能是什么。
如果问题确实与DI代码有关,那么也许这应该是一个单独的问题。在这种情况下,尝试创建一个简洁地演示该问题的小代码示例。如果问题代码很短且非常重要,那么人们更有可能提供帮助。
答案 1 :(得分:0)
确保您已为自己的网站设置SSL。我有一个类似的问题,问题是我没有使用SSL。