ASP.NET MVC 5とWEB API 2にoauth2サーバーを実装する方法[終了]


127

まず、プロジェクトをスケッチします。

私のインターンシップでは、既存のシステムに機能を追加する必要があります。サードパーティのクライアントは、OAuth2を介してユーザーによって承認されると、AX Webサービスからデータにアクセスできる必要があります。私は、クライアントがその呼び出しを行うことができる「プロキシWebサービス」を作成する必要があること、およびAXサービスを呼び出す必要があることを理解していますが、OAuth2の部分については少しわかりません。ほとんどのチュートリアルとガイドは、ASP.NETのFacebookまたはGoogleログイン用のIDの使用に関するものです。それは必要ありません。既存の資格情報を使用する必要があるため、独自のOAuth2サービスを作成する必要があります。

これに関するチュートリアル、ガイド、説明を見つけるのは難しいと思います。私はOAuth2と実行する必要があることを理解していますが、そのようなことをこれまでにしたことがなく、開始するのが難しいと感じています。私が見つけたものに最も近いものは、このgithub repo linkですが、ソリューションは構築されません。

私が考えていたのは、クライアント(サードパーティ)が自分で登録し、クライアントIDを取得できるASP.NET MVC Webサイトの作成です。ASP.NET APIを使用して、必要なトークンとパラメーターを取得し、Dyn AXサービスにアクセスするAPIを作成したいと考えました。

これは正しいですか、それとも完全に間違っていますか?独自のoauth2サーバー/サービスの構築に関するヘルプやリンクがあれば便利です。


回答:


189

私は見ていきますが、章の名前からは、Identityとfacebook / googleログインIDプロバイダーに焦点を当てているので、これも検索対象ではないと思います。
ロビン

3
パート4のみがFacebookとGoogleに関するものです。2か月前に、これらのチュートリアルに基づいて独自の認証コントローラーを実装しました。自分のユーザーデータベースも使用していました。
MichaelS 2014年

1
これらのトークンはどこに保存されますか?Identityはこれを完全に処理しますか?
ロビン

17
@MichaelS私のブログ投稿を参照していただきありがとうございます。プロジェクトに役立ってくれてうれしいです:)
Taiseer Joudeh

@MichaelSトークンベースの認証の方法が残りのAPIにとって十分なセキュリティであるかどうか疑問に思いました。私は彼のブラウザでユーザーのトークンを取得できる場合。トークンはリクエストヘッダーに格納されているので実現できると思いますAuthentication。取得/投稿/配置/削除など、やりたいことはすべてできます。
Joe.wang 2015

87

また、トークン部分を生成する方法に関する記事を見つけるのにも苦労しました。私はそれを見つけたことはなく、自分で書いた。だからそれが役立つ場合:

やることは:

  • 新しいWebアプリケーションを作成する
  • 次のNuGetパッケージをインストールします。
    • Microsoft.Owin
    • Microsoft.Owin.Host.SystemWeb
    • Microsoft.Owin.Security.OAuth
    • Microsoft.AspNet.Identity.Owin
  • OWIN startupクラスを追加する

次にindex.js、次のコンテンツを含むHTMLおよびJavaScript()ファイルを作成します。

var loginData = 'grant_type=password&username=test.test@mail.com&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 == "test.test@mail.com" && context.Password == "test123")
                        {
                            ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
                            context.Validated(oAuthIdentity);
                        }
                    }
                },
                AllowInsecureHttp = true,
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1)
            };

            app.UseOAuthBearerTokens(OAuthOptions);
        }
    }
}

プロジェクトを実行します。トークンがポップアップに表示されます。


5
ASP IDまたはエンティティフレームワークを導入しなかった方法が本当に気に入っています。私が見たほとんどの記事は、これらをOAuthソリューションと統合しています。ソリューションはOAuthとトークンの発行に焦点を当てています。非常に素晴らしい。また、ブログに投稿していただきありがとうございます。
webworm 2016年

@カイ-どこでMicrosoft ASP.NET Identity Owinプレイするのですか?ユーザー認証にASP.NET Identityを使用していますか?そうでない場合、このNuGetパッケージはまだ必要ですか?
webworm 2016年

1
@webworm-この行がapp.UseOAuthBearerTokens(OAuthOptions);ないと動作しませんMicrosoft ASP.NET Identity Owin。メソッドを認識しませんUseOAuthBearerTokens
Kai Hartmann

不足しているパッケージ:Microsoft.Owin.Host.SystemWeb、Microsoft ASP.NET Identity
Owin

3
つまり、Newtonsoft.Jsonの無効なアセンブリエラー(.NET 4.6以降)が発生している場合は、Newtonsoft.Jsonをバージョン11以降に更新してください。
vibs2006


-12

Gmail:OAuth

  • 後藤リンク
  • Gmailユーザー名のパスワードでログインします
  • 左上のGoogleメニューをクリックします
  • API Managerをクリックします
  • 資格情報をクリックします
  • [認証情報を作成]をクリックし、[OAuthクライアント]を選択します
  • アプリケーションの種類としてWebアプリケーションを選択し、名前を入力します-> 承認済みリダイレクトURLを入力します(例:http:// localhost:53922 / signin-google)-> [作成]ボタンをクリックします。これにより、資格情報が作成されます。PlsのをメモしておいてくださいClient IDSecret ID。最後に[OK]をクリックして、資格情報のポップアップを閉じます。
  • 次の重要なステップは、を有効にすることGoogle APIです。左側のペインで[概要]をクリックします。
  • [ Google APIソーシャルAPI]セクションの下をクリックします。
  • [有効にする]をクリックします。

それはすべてグーグルの部分からです。

アプリケーションに戻りApp_start/Startup.Auth.cs、次のスニペットを開いてコメントを外します

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

ClientIdおよびClientSecretを、Google API作成済みの資格情報の値で更新します。

  • アプリケーションを実行する
  • ログインをクリックします
  • [別のセクションを使用してログイン]セクションの下にGoogleボタンが表示されます
  • Googleボタンをクリックします
  • アプリケーションは、ユーザー名とパスワードの入力を要求します
  • Gmailのユーザー名とパスワードを入力し、[サインイン]をクリックします
  • これによりOAuthが実行され、アプリケーションに戻り、GmailIDで登録するように求められます。
  • [登録]をクリックして、GmailIDをアプリケーションデータベースに登録します。
  • IDの詳細が通常の登録として上部に表示されます。
  • ログアウトして、Gmailから再度ログインしてください。これにより、自動的にアプリにログインします。

15
ユーザーはFacebookまたはGmailのログインを使用したくないことを明示的に述べています。
Bartho Bernsmann、2016年

この回答に反対票を投じる必要はないと思います。トップコメントへの賛成票で十分です。この回答には有用な情報が含まれており、回答者はこの情報を提供するために実際の創造的な努力を費やしました。Why punish that effort? おそらく、SOは、OPの質問に誤解しているものとして回答にフラグを付ける方法を必要としています。または、ユーザーがより適切な質問に移動することを提案したり、回答から新しい質問を作成したりできます。
Walter Stabosz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.