【问题标题】:How to get authorization code with OWIN, OAuth and Web API?如何使用 OWIN、OAuth 和 Web API 获取授权码?
【发布时间】:2016-04-04 22:44:30
【问题描述】:

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

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

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

/authorize?response_type=code&client_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,类型 controllerType) 在 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,字符串控制器名称) 在 System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController& 控制器,IControllerFactory& 工厂) 在 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 上下文,AsyncCallback cb,对象 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”端点是可访问的,我没有为此做任何特别的事情。

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

【问题讨论】:

  • 您是否曾设法从您的授权端点获取授权码?如果有,怎么做?

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


【解决方案1】:

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

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

【讨论】:

  • 完整的示例,您也可以查看this Nancy client/server demo。它不使用OAuthAuthorizationServerMiddleware,而是针对 OpenID Connect 进行了更详细的分叉,但您应该明白这一点。
猜你喜欢
  • 2014-05-24
  • 2020-09-08
  • 1970-01-01
  • 2018-01-12
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多