繁体   English   中英

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

[英]How do I make the AuthorizeEndpointPath work in ASP.NET Oauth 2.0 framework

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

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

我试图实现的最后一部分是授权代码工作流程。 这将允许我们授予对我们的应用程序的访问权限,以便集成工具可以访问我们的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的客户端)。

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

因此,经过网上搜索,我通过搜索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”发出请求以获取授权码。 (不要将访问令牌提供给第三方。您的登录页面请求授权代码并将其发回。)换句话说,如果您使用访问令牌,则此流程中涉及两个客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM