【问题标题】:How do I make the AuthorizeEndpointPath work in ASP.NET Oauth 2.0 framework如何使 AuthorizeEndpointPath 在 ASP.NET Oauth 2.0 框架中工作
【发布时间】:2017-08-01 09:20:27
【问题描述】:

我目前有一个网站,我正在尝试实现 OAuth 服务器框架。该网站目前是 Web Forms(不是 MVC)和 Web API 2 的组合。就我试图做的事情而言,我们无法更改系统的整体架构。

到目前为止,我通过 Web API 使用 OAuth 来验证客户端、生成访问令牌和处理刷新令牌。

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

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

  1. 用户被定向到我在 Startup.Auth 文件中定义的 AuthorizeEndpointPath
  2. 用户要么看到一个登录页面(如果他们还没有网站的身份验证 cookie),要么他们看到一个特殊页面,他们必须在其中授予访问帐户的权限(类似于 Google 所拥有的)李>
  3. 一旦用户单击“授予”按钮,OWIN 中间件将处理请求,并将它们重定向回请求访问的原始客户端 URL

但是,在我完成所有配置之后,每当我直接访问 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 显示我的自定义授权页面?

当最终显示授权页面时,当用户单击“授予”按钮时,我需要做什么。是否需要设置任何配置,或者需要对 OWIN 进行任何调用?

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

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

【问题讨论】:

    标签: c# oauth owin


    【解决方案1】:

    我有一个question,结果与你的相似。

    所以,在网上搜索了一番之后,我通过搜索github获得了一些成功。显然,OAuthAuthorizationServerProvider 提供AuthorizeEndpoint 并且该方法应该用于“嘿,你没有被授权,去登录你!”以及“啊,好吧,你很酷,这是一个授权码。”。我曾预计OAuthAuthorizationServerProvider 会有两种单独的方法,但事实并非如此。这就解释了为什么在 github 上,我发现一些项目以一种相当奇特的方式实现了 AuthorizeEndpoint。我采用了这个。这是一个例子:

    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();
    }
    

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

    您在/account/login 创建一个单独的登录页面。这样做是让用户登录。如果您的 WebAPI 使用基于 cookie 的身份验证,您可以再次将用户重定向回 AuthorizeEndpoint。如果您使用访问令牌,您的登录页面必须使用访问令牌向“AuthorizeEndpoint”发出请求以获取授权码。 (不要将访问令牌提供给第三方。您的登录页面请求授权码并将其发回。)换句话说,如果您使用访问令牌,则此流程涉及两个客户端。

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多