2014-11-05 49 views
98

首先,我將勾畫我的項目:如何實現在ASP.NET MVC 5的oauth2服務器和Web API 2

對於我的實習船,我需要將功能添加到現有的系統。一旦第三方客戶端通過oauth2獲得用戶的授權,就必須能夠訪問AX Web服務中的數據。我知道我需要做一個'代理網絡服務',客戶可以在那裏打他的電話,這叫做AX服務,但我對oauth2部分有些不確定。大多數教程和指南都是關於使用ASP.NET的Identity for Facebook或Google登錄。我不需要,我需要使用現有的憑據,所以我需要做我自己的oauth2服務。

我覺得很難找到關於此的教程,指南或解釋。我瞭解oauth2和需要做什麼,但我從未做過這樣的事情,並且很難開始。我發現最接近我需要的是github repo link,但該解決方案無法構建。

我想到的是製作一個ASP.NET MVC網站,客戶端(第三方)可以註冊自己並獲取他們的客戶端ID。使用ASP.NET API時,我想創建帶有所需令牌和參數的API,然後訪問Dyn AX服務。

這是正確的還是我完全錯了?任何有關構建自己的oauth2服務器/服務的幫助或鏈接都會很好。

+0

http://leastprivilege.com/2013/11/13/embedding-a-simple-usernamepassword-authorization-server-in-web-api-v2/ – pomber 2015-05-04 02:12:01

回答

161
+0

我會看看,但是從章節名稱我認爲這又不是我搜索的內容,因爲它專注於Identity和Facebook /谷歌登錄身份提供商。 – Robin 2014-11-05 13:12:36

+2

只有第4部分是關於Facebook和谷歌。兩個月前,我基於這些教程實現了自己的身份驗證控制器。我也使用我自己的用戶數據庫。 – MichaelS 2014-11-05 13:19:17

+0

非常感謝:) – Robin 2014-11-05 14:14:51

66

我也掙扎尋找如何剛剛生成令牌的部分文章。我從來沒有找到一個,寫我自己的。所以,如果它有助於:

做的事情是:

  • 創建一個新的Web應用程序
  • 安裝以下的NuGet包:
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • 添加OWIN startup

然後創建一個HTML和JavaScript的(index.js)與這些文件內容:

var loginData = 'grant_type=password&[email protected]&password=test123'; 

var xmlhttp = new XMLHttpRequest(); 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
     alert(xmlhttp.responseText); 
    } 
} 
xmlhttp.open("POST", "/token", true); 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xmlhttp.send(loginData); 
<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <script type="text/javascript" src="index.js"></script> 
</body> 
</html> 

的OWIN startup類應該有這個內容:

using System; 
using System.Security.Claims; 
using Microsoft.Owin; 
using Microsoft.Owin.Security.OAuth; 
using OAuth20; 
using Owin; 

[assembly: OwinStartup(typeof(Startup))] 

namespace OAuth20 
{ 
    public class Startup 
    { 
     public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

     public void Configuration(IAppBuilder app) 
     { 
      OAuthOptions = new OAuthAuthorizationServerOptions() 
      { 
       TokenEndpointPath = new PathString("/token"), 
       Provider = new OAuthAuthorizationServerProvider() 
       { 
        OnValidateClientAuthentication = async (context) => 
        { 
         context.Validated(); 
        }, 
        OnGrantResourceOwnerCredentials = async (context) => 
        { 
         if (context.UserName == "[email protected]" && context.Password == "test123") 
         { 
          ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType); 
          context.Validated(oAuthIdentity); 
         } 
        } 
       }, 
       AllowInsecureHttp = true, 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(1) 
      }; 

      app.UseOAuthBearerTokens(OAuthOptions); 
     } 
    } 
} 

運行您的項目。令牌應顯示在彈出窗口中。

+2

不錯,我喜歡您的解決方案是多麼極簡主義,您應該將代碼放在您的答案。 – pomber 2015-05-04 01:46:07

+0

謝謝,我試圖展示最低要求。我將主要步驟放入答案中本身。 – 2015-05-04 06:37:16

+4

我真的很喜歡你沒有帶入ASP Identity或Entity Framework。我看到的大多數文章都將這些與OAuth解決方案整合在一起。您的解決方案專注於OAuth和令牌的頒發。非常好。也感謝您在博客上張貼。 – webworm 2016-06-27 21:11:42

-9

的Gmail:OAuth的

  • 轉到了link
  • 登錄與您的Gmail用戶名密碼
  • 點擊頂部的谷歌菜單上留下
  • 點擊API經理
  • 點擊憑據
  • 單擊創建憑證並選擇OAuth客戶端
  • 選擇Web應用程序作爲應用程序類型並輸入名稱 - >輸入授權重定向URL(例如:http://localhost:53922/signin-google) - >單擊創建按鈕。這將創建憑據。請注意0​​和Secret ID。最後點擊確定關閉彈出的憑證。
  • 下一個重要步驟是啓用Google API。點擊左側窗格中的概述。
  • 單擊社交API部分下的Google API
  • 單擊啓用。

這些都來自Google部分。

回到你的應用程序,打開App_start/Startup.Auth.cs並取消下面的代碼片段

 app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() 
     { 
      ClientId = "", 
      ClientSecret = "" 
     }); 

更新ClientIdClientSecret與價值觀從您已經創建Google API憑據。

  • 運行應用程序
  • 點擊登錄
  • 你會看到在「使用另一段登錄」部分
  • 點擊谷歌按鈕,谷歌按鈕
  • 應用程序會提示你輸入用戶名和密碼
  • 輸入Gmail用戶名和密碼,然後點擊登錄
  • 這將執行OAuth並返回到您的應用程序並提示您註冊Gmail ID。
  • 點擊註冊將Gmail id註冊到您的應用程序數據庫中。
  • 您將看到身份詳細信息出現在正常註冊的頂部
  • 嘗試註銷並通過Gmail重新登錄。這會自動將您登錄到應用程序中。
+7

用戶明確聲明他不想使用Facebook或Gmail登錄。 – 2016-05-06 14:59:28