簡體   English   中英

具有社交登錄且沒有MVC依賴關系的ASP.NET WebAPI 2.2 SPA

[英]ASP.NET WebAPI 2.2 SPA with social login and no MVC dependencies

我一直在設計一個應用程序,它只是一個靜態服務的客戶端頁面,旨在使用承載令牌通過支持API進行身份驗證,但最近我一直在嘗試向后端添加社交登錄選項,但發現它很難找到任何不使用MVC依賴項的示例,如果可能,我希望避免使用它們。

這個問題對入門很有幫助: 用於Web和Mobile的ASP.NET Web API社交認證

但是我一直在努力讓我的項目在同一個庄園中工作,基本上在我引用的問題中他已經配置了OAuthAuthorizationServerOptions.AuthorizeEndpointPath如下所示:

OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/token"),
                Provider = new ApplicationOAuthProvider(PublicClientId),
                AuthorizeEndpointPath = new PathString("/api/account/externallogin"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                //AllowInsecureHttp = false
            };

同樣在他的支持api帳戶控制器中,他有以下行動:

[OverrideAuthentication]
        [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
        [AllowAnonymous]
        [Route("ExternalLogin", Name = "ExternalLogin")]
        public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)

在這個例子中,我無法弄清楚RouteAttribute (模板)的第一個參數在項目中實際引用的內容,如果有的話,有人可能會解釋它在這個上下文中的作用嗎?

現在當運行向'api / Account / ExternalLogin'發送GET請求的問題中提供的示例項目時,請求將在他的API帳戶控制器中的操作上處理,我認為它與OverrideAuthentication但我得到了一點超出我的深度,努力尋找這個屬性的其他用法的強大例子。

但是我相當肯定我已經按照他描述的方式正確配置了我的WebAPI項目,但是當我向我的OAuthAuthorizationServerOptions.AuthorizeEndpointPath發送GET請求時,它不在我的API帳戶控制器上處理,而是由我的OAuthAuthorizationServerProvider實現,它返回一個' invalid_request'錯誤。

任何人都可以想到我可能會忽略的一些因素導致我的API帳戶控制器操作被忽略?

我也閱讀了這篇文章,但它似乎是用舊版本的WebAPI編寫的: https ://thompsonhomero.wordpress.com/2015/01/21/creating-a-clean-web-api-2- 項目與外部的認證部分-2 /

感謝您的幫助,Alex。

如果沒有真正看到您正在進行的GET請求,我只能假設它們不符合OAuth提供商的期望。

提供者首先驗證正在進行的請求, 然后它將控制權交給端點的控制器。 您的代碼很可能是正確的,只是請求格式錯誤。

我創建了一個新項目,並通過向AuthorizeEndpointPath發出get請求來復制您描述的問題。 不幸的是,沒有太多關於為什么,但如果你反編譯源,或設法找到源,你可以看到這里發生了什么。

反編譯ApplicationOAuthProvider.ValidateClientRedirectUri的調用代碼,我得到:

  await this.Options.Provider.ValidateClientRedirectUri(clientContext);
  if (!clientContext.IsValidated)
  {
    LoggerExtensions.WriteVerbose(this._logger, "Unable to validate client information");
    flag = await this.SendErrorRedirectAsync(clientContext, (BaseValidatingContext<OAuthAuthorizationServerOptions>) clientContext);
  }
  else
  {
    OAuthValidateAuthorizeRequestContext validatingContext = new OAuthValidateAuthorizeRequestContext(this.Context, this.Options, authorizeRequest, clientContext);
    if (string.IsNullOrEmpty(authorizeRequest.ResponseType))
    {
      LoggerExtensions.WriteVerbose(this._logger, "Authorize endpoint request missing required response_type parameter");
      validatingContext.SetError("invalid_request");
    }
    else if (!authorizeRequest.IsAuthorizationCodeGrantType && !authorizeRequest.IsImplicitGrantType)
    {
      LoggerExtensions.WriteVerbose(this._logger, "Authorize endpoint request contains unsupported response_type parameter");
      validatingContext.SetError("unsupported_response_type");
    }
    else
      await this.Options.Provider.ValidateAuthorizeRequest(validatingContext);
    if (!validatingContext.IsValidated)
    {
      flag = await this.SendErrorRedirectAsync(clientContext, (BaseValidatingContext<OAuthAuthorizationServerOptions>) validatingContext);
    }
    else
    {
      this._clientContext = clientContext;
      this._authorizeEndpointRequest = authorizeRequest;
      OAuthAuthorizeEndpointContext authorizeEndpointContext = new OAuthAuthorizeEndpointContext(this.Context, this.Options, authorizeRequest);
      await this.Options.Provider.AuthorizeEndpoint(authorizeEndpointContext);
      flag = authorizeEndpointContext.IsRequestCompleted;
    }
  }

在此代碼中,您可以看到如果請求已經過驗證並且未提供請求的指定ResponseType ,則將上下文的錯誤設置為“invalid_request”。

我能夠使用以下請求URI成功獲取請求以成功進入ExternalLogin控制器方法:

http://localhost:18086/api/Account/ExternalLogin?provider=none&client_id=self&redirect_uri=http://localhost:18086/&response_type=token`

PS就控制器上的route屬性而言,“template”字段指定將用作模板以匹配傳入請求URI的字符串,以確定應將請求路由到何處。

PPS可以在此處找到反編譯代碼段的實際源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM