![](/img/trans.png)
[英]Github OAuth provider with ASP.NET Core 2.0 does not work
[英]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,而无需在本地存储用户凭据。
我对它应该如何运作的理解如下:
但是,在我的所有配置之后,每当我直接访问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.