如何使AuthorizeEndpointPath在ASP.NET Oauth 2.0框架中工作

时间:2017-03-10 21:57:19

标签: c# oauth owin

我目前有一个网站,我正在尝试实施OAuth服务器框架。该网站目前是Web Forms(非MVC)和Web API 2的组合。出于我想要做的目的,我们无法改变系统的整体架构。

到目前为止,我让OAuth通过Web API工作,以验证客户端,生成访问令牌和处理刷新令牌。

我想要实现的最后一部分是授权代码工作流程。这将允许我们授予对应用程序的访问权限,以便集成工具可以访问我们的API,而无需在本地存储用户凭据。

我对它应该如何运作的理解如下:

  1. 将用户定向到我在Startup.Auth文件中定义的AuthorizeEndpointPath
  2. 用户可以看到登录页面(如果他们没有网站的身份验证Cookie),或者他们看到一个特殊页面,他们必须授予访问该帐户的权限(类似于Google所拥有的)
  3. 用户点击" grant"按钮,OWIN中间件将处理请求,并将它们重定向回请求访问的原始客户端URL
  4. 但是,在我的所有配置之后,每当我直接访问AuthorizeEndpointPath时,"授予访问权限"页面永远不会实际显示。

    我确保了以下配置,但是没有关于正确配置的文档。

    var oAuthServerOptions = new OAuthAuthorizationServerOptions()
                {
                    AllowInsecureHttp = true,
                    TokenEndpointPath = new PathString("/api/token"),
                    AuthorizeEndpointPath = new PathString("/LoginAuthorize.aspx"),
                    //AuthorizeEndpointPath = new PathString("/api/authorize"),
                    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(10),
                    Provider = new ApiAuthorizationServerProvider(),
                    RefreshTokenProvider = new ApiRefreshTokenProvider(),
                    AuthorizationCodeProvider = new ApiAuthoirzationCodeProvider()
                };
    

    目前" AuthorizeEndpointPath"属性映射到实际页面,我要求用户确认,但该页面未显示

    通过调试,我甚至可以在加载授权页面之前看到框架遇到以下方法

    ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
    

    我试图重载该方法,并且发生了两件事之一。如果我调用context.Validated();,则会立即重定向用户,而不显示授权页面。如果没有"验证"重定向URI,然后显示一个空白页面,表示" invalid_request"。

    所以最大的问题是如何让OWIN显示我的自定义授权页面?

    当最终显示授权页面时,当用户点击" grant"时,我需要做什么?按钮。我需要设置任何配置,还是需要对OWIN进行任何调用?

    另外,如何在显示该页面之前确保用户进行身份验证?如果他们没有登录,我是否只是让我的代码将用户重定向到登录页面?如果是这样,OWIN将如何处理真正的重定向回到客户端(如果用户登录后将被重定向到授权页面)?

    最后,一旦正确配置完毕,我是否仍然能够支持当前的OAuth工作流程,允许客户端手动传递其凭据"令牌" API?我问的原因是因为我们的移动应用程序也有自己的登录屏幕,并且将使用OAuth连接(除了其他基于Web的客户端)。

1 个答案:

答案 0 :(得分:0)

我有一个question与你的相似。

因此,在网上进行了大量搜索之后,我通过搜索github获得了一些成功。显然,string time24 = dateTime.ToString("HH:mm:ss"); //"09:35:37" string time12 = dateTime.ToString("h:mm:ss tt"); //"9:35:37 AM" 提供了OAuthAuthorizationServerProvider,并且该方法应同时用于“嘿,您未被授权,请登录!”以及“啊,好极了,这是授权码”。我曾预期AuthorizeEndpoint可以有两种单独的方法,但事实并非如此。这就解释了为什么在github上,我找到一些以特殊方式实现OAuthAuthorizationServerProvider的项目。我已经采纳了。这是一个示例:

AuthorizeEndpoint

来源:https://github.com/wj60387/WebApiOAUthBase/blob/master/OwinWebApiBase/WebApiOwinBase/Providers/OAuthServerProvider.cs

您可以在public override async Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context) { if (context.Request.User != null && context.Request.User.Identity.IsAuthenticated) { var redirectUri = context.Request.Query["redirect_uri"]; var clientId = context.Request.Query["client_id"]; var authorizeCodeContext = new AuthenticationTokenCreateContext( context.OwinContext, context.Options.AuthorizationCodeFormat, new AuthenticationTicket( (ClaimsIdentity)context.Request.User.Identity, new AuthenticationProperties(new Dictionary<string, string> { {"client_id", clientId}, {"redirect_uri", redirectUri} }) { IssuedUtc = DateTimeOffset.UtcNow, ExpiresUtc = DateTimeOffset.UtcNow.Add(context.Options.AuthorizationCodeExpireTimeSpan) })); await context.Options.AuthorizationCodeProvider.CreateAsync(authorizeCodeContext); context.Response.Redirect(redirectUri + "?code=" + Uri.EscapeDataString(authorizeCodeContext.Token)); } else { context.Response.Redirect("/account/login?returnUrl=" + Uri.EscapeDataString(context.Request.Uri.ToString())); } context.RequestCompleted(); } 上创建一个单独的登录页面。这样做是使用户登录。如果您的WebAPI使用基于cookie的身份验证,则可以再次将用户重定向回/account/login。如果您使用访问令牌,则您的登录页面必须使用访问令牌向“ AuthorizeEndpoint”发出请求,以获取授权码。 (不要将访问令牌提供给第三方。您的登录页面会请求授权码并将其发送回去。)换句话说,如果您使用访问令牌,那么此流程中将涉及两个客户端。