web-dev-qa-db-ja.com

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

最初に自分のプロジェクトをスケッチします。

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

これに関するチュートリアル、ガイド、または説明を見つけるのは難しいと思います。私はOAuth2と何をする必要があるかを理解していますが、私は以前にそのようなことをしたことがなく、始めるのが難しいと感じています。私が見つけたものに最も近いものはこれです githubリポジトリリンク 、しかし解決策は構築されません。

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

これは正しいですか、それとも私は完全に間違っていますか?あなた自身のoauth2サーバ/サービスを構築することに関するどんな助けまたはリンクもいいでしょう。

119
Robin
182
MichaelS

トークン部分の生成方法に関する記事を見つけるのにも苦労しました。私は一度も見つけて自分で書いたことはありません。もしそれが役立つなら:

やることは:

  • 新しい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);
        }
    }
}

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

80
Kai Hartmann

私は同じことを調べていて、ASP.NETの上にOAuthとOpenIDを実装している identityserver を見つけました。 Entity Frameworkの永続化サポートにより、 ASP.NET ID および Membership Reboot と統合されています。

ですから、あなたの質問に答えるためには、 OAuthとOpenIDサーバーをどのように設定するか に関する詳細な文書をチェックしてください。

4
Korayem