"错误":" invalid_client"来自自定义OWIN实现

时间:2014-06-23 22:27:43

标签: owin asp.net-web-api2

我正在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);

    }
}

2 个答案:

答案 0 :(得分:0)

那里有很多代码,因此隔离问题并不容易。作为第一步,请考虑删除Autofac DI的代码,看看是否有任何区别。很难说出问题可能是什么。

如果问题确实与DI代码有关,那么也许这应该是一个单独的问题。在这种情况下,尝试创建一个简洁地演示该问题的小代码示例。如果问题代码很短且非常重要,那么人们更有可能提供帮助。

答案 1 :(得分:0)

确保您已为自己的网站设置SSL。我有一个类似的问题,问题是我没有使用SSL。