簡體   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