如何使用OWIN,OAuth和Web API获取授权代码?

时间:2015-12-30 22:37:16

标签: c# asp.net-web-api oauth-2.0 owin

我关注了这篇文章:Token Based Authentication using ASP.NET Web API 2, Owin, and Identity。现在,我有一个Web API独立“服务器”能够成功验证用户,并在向其发送用户名/密码时返回访问令牌。然后,我可以使用访问令牌来访问受保护的数据(在博客文章中,我可以访问订单)。

目前,我发送用户名/密码以获取访问令牌的客户端是一个控制台应用程序。

我想增加一点复杂性,在获取访问令牌之前,我想获得一个授权码。但我找不到任何关于如何做的例子。根据我的阅读,我应该发送一个这样的GET请求:

  

/授权RESPONSE_TYPE =代码&安培; CLIENT_ID = LT;客户端ID>

这就是我在控制台应用程序中所做的事情:

using (var client = new HttpClient())
{
    var response = await client.GetAsync("http://localhost:63828/authorize?response_type=code&client_id=" + Guid.NewGuid());

    var responseString = response.Content.ReadAsStringAsync().Result;
}

但是我收到一条错误消息:

  

无法找到资源。

     

[HttpException]:未找到路径'/ authorize'的控制器或未实现IController。      在System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,Type controllerType)      在System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,String controllerName)      在System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController& controller,IControllerFactory& factory)      在System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback回调,对象状态)      在System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,AsyncCallback回调,对象状态)      在System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData)      在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()      在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)

这是Web API项目中Startup.cs文件的内容:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();

        ConfigureOAuth(app);

        WebApiConfig.Register(config);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AuthorizeEndpointPath = new PathString("/authorize"),
            ApplicationCanDisplayErrors = true,
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new SimpleAuthorizationServerProvider()
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
}

我觉得奇怪的是我定义了“/ authorize”端点,但它无法访问...“/ token”端点是可访问的,我没有做任何特别的事情。

知道如何克服这个问题吗?

1 个答案:

答案 0 :(得分:3)

使用Katana内置的OAuth2授权服务器时要记住的一个重要事项是,默认情况下,其授权端点为 pass-through :您必须提供自己的 / authorize 端点(例如,使用MVC或Nancy)或直接在 OAuthAuthorizationServerProvider.AuthorizationEndpoint 中呈现您的同意书。

您可以查看official documentation,了解如何实施自己的MVC控制器和自己的授权终端的完整演练。