我目前有一个网站,我正在尝试实施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显示我的自定义授权页面?
当最终显示授权页面时,当用户点击" grant"时,我需要做什么?按钮。我需要设置任何配置,还是需要对OWIN进行任何调用?
另外,如何在显示该页面之前确保用户进行身份验证?如果他们没有登录,我是否只是让我的代码将用户重定向到登录页面?如果是这样,OWIN将如何处理真正的重定向回到客户端(如果用户登录后将被重定向到授权页面)?
最后,一旦正确配置完毕,我是否仍然能够支持当前的OAuth工作流程,允许客户端手动传递其凭据"令牌" API?我问的原因是因为我们的移动应用程序也有自己的登录屏幕,并且将使用OAuth连接(除了其他基于Web的客户端)。
答案 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
您可以在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”发出请求,以获取授权码。 (不要将访问令牌提供给第三方。您的登录页面会请求授权码并将其发送回去。)换句话说,如果您使用访问令牌,那么此流程中将涉及两个客户端。