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

5
我遵循了这篇文章:使用ASP.NET Web API 2、Owin和Identity进行基于令牌的身份验证。现在,我有一个Web API独立的“服务器”,能够成功地验证用户并在我向它发送用户名/密码时返回访问令牌。然后,我可以使用访问令牌来访问受保护的数据(在博客文章中,我可以访问订单)。
目前,我发送用户名/密码以获取访问令牌的客户端是一个控制台应用程序。
我想增加一些复杂性,在获取访问令牌之前,我想获取授权码。但是我找不到任何关于如何执行此操作的示例。从我所读的内容来看,我应该发送一个结构化的GET请求,如下所示:
/authorize?response_type=code&client_id=< ClientID>
这是我从我的控制台应用程序中执行的操作:
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接口。 at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at 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”端点是可访问的,而我并没有做任何特殊处理。
你有什么想法可以解决这个问题吗?

你是否曾经成功从授权终端获取授权码?如果是,你是如何做到的? - foyss
1个回答

3
重要提示:在使用Katana内置的OAuth2授权服务器时,请记住它的授权终点默认为“穿透式”,您必须提供自己的“/authorize”终点(例如使用MVC或Nancy)或直接在“OAuthAuthorizationServerProvider.AuthorizationEndpoint”中呈现您的同意表单。
您可以查看官方文档以获取完整的演示,指导您如何实现自己的MVC控制器和授权终点。链接如下:official documentation

1
你可以查看 这个 Nancy 客户端/服务器示例 来获取完整的样例。它不使用 OAuthAuthorizationServerMiddleware,而是使用了一个更为复杂的针对 OpenID Connect 的分支,但你应该可以理解其思路。 - Kévin Chalet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接