![](/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.