.NETプロジェクトにOAuth2ログインを統合する最も包括的で便利なフレームワーク

.NETプロジェクトにOAuth2ログインを統合する最も包括的で便利なフレームワーク

MrHuo.OAuthは、.NETプロジェクトにOAuth2ログインを統合する最も包括的で便利なフレームワークです。

最終更新 2022/04/12 22:48
mrhuo
読了目安 7 分
カテゴリ
.NET
テーマ
C#オープンソースプロジェクト
タグ
.NET C# オープンソース 認証 オープンソースC#

MrHuo.OAuth

.NETプロジェクトにOAuth2ログインを統合するための、最も包括的で便利なフレームワークです

Travis (.org) GitHub stars GitHub license

.NET Core プロジェクトまたは .NET Framework 4.6 プロジェクトで使用可能

体験サイト:https://oauthlogin.net/


サポート済みプラットフォーム

  • 百度(利用可能)
  • WeChat 公式アカウント(利用可能)
  • Gitlab(利用可能)
  • Gitee(利用可能)
  • GitHub(利用可能)
  • 華為(利用可能)
  • Coding.net(利用可能)
  • Sina Weibo(利用可能)
  • Alipay(利用可能)
  • OSChina(利用可能)
  • Xunlei(利用可能)
  • DingTalk 内部ログイン(利用可能)
  • DingTalk QRコードログイン(利用可能)
  • QQ(利用可能)
  • Microsoft(利用可能)
  • Xiaomi(利用可能)
  • StackOverflow(利用可能)
  • Facebook(利用可能)by Donma Hsu
  • Google(利用可能)
  • LinkedIn(利用可能、NuGet公開待ち)
  • Douyin(利用可能、NuGet公開待ち)by feng lui
  • Kuaishou(利用可能、NuGet公開待ち)by feng lui
  • WeChat オープンプラットフォーム(テスト待ち)
  • 美団(テスト待ち)

計画

  • 飛書
  • 淘宝
  • 西瓜
  • 今日頭条
  • 人人網
  • Teambition
  • Pinterest
  • Twitter
  • 企業微信QRコードログイン
  • 企業微信Webログイン
  • 酷家楽
  • 餓了麼
  • 京東
  • 阿里雲
  • 喜馬拉雅...

使用方法

新しいWebプロジェクトを作成し、nugetパッケージをインストールするだけで使用できます。

現在利用可能な nuget パッケージの一覧:

https://www.nuget.org/packages?q=MrHuo.OAuth

Gitlab

Install-Package MrHuo.OAuth.Gitlab -Version 1.1.1

WeChat 公式アカウント

Install-Package MrHuo.OAuth.Wechat -Version 1.1.1

oschina.net

Install-Package MrHuo.OAuth.OSChina -Version 1.1.1

coding.net

Install-Package MrHuo.OAuth.Coding -Version 1.1.1

github.com

Install-Package MrHuo.OAuth.GitHub -Version 1.1.1

alipay.com

Install-Package MrHuo.OAuth.Alipay -Version 1.1.1

baidu.com

Install-Package MrHuo.OAuth.Baidu -Version 1.1.1

huawei.com

Install-Package MrHuo.OAuth.Huawei -Version 1.1.1

gitee.com

Install-Package MrHuo.OAuth.Gitee -Version 1.1.1

weibo.com

Install-Package MrHuo.OAuth.SinaWeibo -Version 1.1.1

xunlei.com

Install-Package MrHuo.OAuth.XunLei -Version 1.1.1

qq.com

Install-Package MrHuo.OAuth.QQ -Version 1.1.1

microsoft.com

Install-Package MrHuo.OAuth.Microsoft -Version 1.1.1

mi.com

Install-Package MrHuo.OAuth.Mi -Version 1.1.1

stackoverflow.com

Install-Package MrHuo.OAuth.StackOverflow -Version 1.1.1

facebook.com

Install-Package MrHuo.OAuth.Facebook -Version 1.1.1

google.com

Install-Package MrHuo.OAuth.Google -Version 1.0.0
  1. Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // 第三方ログインコンポーネントを注入
    services.AddSingleton(new Baidu.BaiduOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:baidu")));
    services.AddSingleton(new Wechat.WechatOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:wechat")));
    services.AddSingleton(new Gitlab.GitlabOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:gitlab")));
    services.AddSingleton(new Gitee.GiteeOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:gitee")));
    //... その他のログイン方法
}

注意:appsettings.json 経由で設定を読み込む場合、便利なメソッドが用意されています。

OAuthConfig.LoadFrom(Configuration, "oauth:baidu")

"oauth:baidu" の部分は設定のプレフィックスで、設定形式は以下の通りです:

{
  "oauth": {
    "qq": {
      "app_id": "qq_app_id",
      "app_key": "qq_app_key",
      "redirect_uri": "https://oauthlogin.net/oauth/qqcallback",
      "scope": "get_user_info"
    },
    "github": {
      "app_id": "github_app_id",
      "app_key": "github_app_key",
      "redirect_uri": "https://oauthlogin.net/oauth/githubcallback",
      "scope": "repo"
    },
    "wechat": {
      "app_id": "wechat_app_id",
      "app_key": "wechat_app_key",
      "redirect_uri": "https://oauthlogin.net/oauth/wechatcallback",
      "scope": "snsapi_userinfo"
    },
    "huawei": {
      "app_id": "huawei_app_id",
      "app_key": "huawei_app_key",
      "redirect_uri": "https://oauthlogin.net/oauth/huaweicallback",
      "scope": "https://www.huawei.com/auth/account"
    },
    "gitee": {
      "app_id": "gitee_app_id",
      "app_key": "gitee_app_key",
      "redirect_uri": "http://oauthlogin.net/oauth/giteecallback",
      "scope": "user_info"
    },
    "baidu": {
      "app_id": "baidu_app_id",
      "app_key": "baidu_app_key",
      "redirect_uri": "http://oauthlogin.net/oauth/baiducallback",
      "scope": "basic"
    },
    "alipay": {
      "app_id": "alipay_app_id",
      "app_key": "alipay_app_key",
      "redirect_uri": "https://oauthlogin.net/oauth/alipaycallback",
      "scope": "auth_user",
      "private_key": "private_key",
      "public_key": "public_key"
    },
    "gitlab": {
      "app_id": "gitlab_app_id",
      "app_key": "gitlab_app_key",
      "redirect_uri": "http://oauthlogin.net/oauth/gitlabcallback",
      "scope": "read_user"
    }
  }
}
  1. OAuthController.cs(必要に応じて適宜命名)
public class OAuthController : Controller
{
    [HttpGet("oauth/{type}")]
    public IActionResult Index(
        string type,
        [FromServices] BaiduOAuth baiduOAuth,
        [FromServices] WechatOAuth wechatOAuth
    )
    {
        var redirectUrl = "";
        switch (type.ToLower())
        {
            case "baidu":
                {
                    redirectUrl = baiduOAuth.GetAuthorizeUrl();
                    break;
                }
            case "wechat":
                {
                    redirectUrl = wechatOAuth.GetAuthorizeUrl();
                    break;
                }
            default:
                return ReturnToError($"「{type}」のログイン方法は未実装です!");
        }
        return Redirect(redirectUrl);
    }

    [HttpGet("oauth/{type}callback")]
    public async Task<IActionResult> LoginCallback(
        string type,
        [FromServices] BaiduOAuth baiduOAuth,
        [FromServices] WechatOAuth wechatOAuth,
        [FromQuery] string code,
        [FromQuery] string state)
    {
        try
        {
            switch (type.ToLower())
            {
                case "baidu":
                    {
                        var authorizeResult = await baiduOAuth.AuthorizeCallback(code, state);
                        if (!authorizeResult.IsSccess)
                        {
                            throw new Exception(authorizeResult.ErrorMessage);
                        }
                        return Json(authorizeResult);
                    }
                case "wechat":
                    {
                        var authorizeResult = await wechatOAuth.AuthorizeCallback(code, state);
                        if (!authorizeResult.IsSccess)
                        {
                            throw new Exception(authorizeResult.ErrorMessage);
                        }
                        return Json(authorizeResult);
                    }
                default:
                    throw new Exception($"「{type}」のログインコールバックは未実装です!");
            }
        }
        catch (Exception ex)
        {
            return Content(ex.Message);
        }
    }
}
  1. Views
<!-- コード内に認証ボタンを配置 -->
<a href="/oauth/baidu">Baidu ログイン</a>
<a href="/oauth/wechat">WeChat QRコードログイン</a>
<!-- //他のログイン方法も同様に追加 -->

拡張

他のプラットフォームの拡張は非常に簡単です。例として Gitee プラットフォームのコードを示します:https://github.com/mrhuo/MrHuo.OAuth/tree/main/MrHuo.OAuth.Gitee

ステップ1:プラットフォームのOAuthドキュメントから、ユーザー情報取得APIが返すJSONを探し、C#エンティティクラスに変換します。例:

必要に応じてユーザープロパティを拡張してください。

public class GiteeUserModel : IUserInfoModel
{
    [JsonPropertyName("name")]
    public string Name { get; set; }

    [JsonPropertyName("avatar_url")]
    public string Avatar { get; set; }

    [JsonPropertyName("message")]
    public string ErrorMessage { get; set; }

    [JsonPropertyName("email")]
    public string Email { get; set; }

    [JsonPropertyName("blog")]
    public string Blog { get; set; }

    //...その他のプロパティも同様
}
ステップ2:対応プラットフォームの認証インターフェースを実装
/// <summary>
/// https://gitee.com/api/v5/oauth_doc#/
/// </summary>
public class GiteeOAuth : OAuthLoginBase<GiteeUserModel>
{
    public GiteeOAuth(OAuthConfig oauthConfig) : base(oauthConfig) { }
    protected override string AuthorizeUrl => "https://gitee.com/oauth/authorize";
    protected override string AccessTokenUrl => "https://gitee.com/oauth/token";
    protected override string UserInfoUrl => "https://gitee.com/api/v5/user";
}

コメントを含めてもたった10行。ご覧のとおり非常に簡単です。プラットフォームがOAuth2標準に従っていれば、これだけで完了です。

例えば、フィールドを修正する必要があるWeChatログインの実装でも、基本パラメータを定義するだけです。コードは以下の通り:

/// <summary>
/// WeChat OAuth 関連ドキュメント:
/// <para>https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html</para>
/// </summary>
public class WechatOAuth : OAuthLoginBase<WechatAccessTokenModel, WechatUserInfoModel>
{
    public WechatOAuth(OAuthConfig oauthConfig) : base(oauthConfig) { }
    protected override string AuthorizeUrl => "https://open.weixin.qq.com/connect/oauth2/authorize";
    protected override string AccessTokenUrl => "https://api.weixin.qq.com/sns/oauth2/access_token";
    protected override string UserInfoUrl => "https://api.weixin.qq.com/sns/userinfo";
    protected override Dictionary<string, string> BuildAuthorizeParams(string state)
    {
        return new Dictionary<string, string>()
        {
            ["response_type"] = "code",
            ["appid"] = oauthConfig.AppId,
            ["redirect_uri"] = System.Web.HttpUtility.UrlEncode(oauthConfig.RedirectUri),
            ["scope"] = oauthConfig.Scope,
            ["state"] = state
        };
    }
    public override string GetAuthorizeUrl(string state = "")
    {
        return $"{base.GetAuthorizeUrl(state)}#wechat_redirect";
    }
    protected override Dictionary<string, string> BuildGetAccessTokenParams(Dictionary<string, string> authorizeCallbackParams)
    {
        return new Dictionary<string, string>()
        {
            ["grant_type"] = "authorization_code",
            ["appid"] = $"{oauthConfig.AppId}",
            ["secret"] = $"{oauthConfig.AppKey}",
            ["code"] = $"{authorizeCallbackParams["code"]}"
        };
    }
    protected override Dictionary<string, string> BuildGetUserInfoParams(WechatAccessTokenModel accessTokenModel)
    {
        return new Dictionary<string, string>()
        {
            ["access_token"] = accessTokenModel.AccessToken,
            ["openid"] = accessTokenModel.OpenId,
            ["lang"] = "zh_CN",
        };
    }
}

特別貢献者

  1. Carl
  2. Donma Hsu
  3. feng lui

皆様が様々なプラットフォームのログインコンポーネントを問題なく利用できるよう、テスト用の各種プラットフォームのAPPIDを緊急で募集しています。ご提供いただける方はご連絡ください。 テスト用APPIDを提供していただいた方は、プロジェクトのトップページの特別貢献者リストに永続的に掲載されます(リンク付き可能)。

メール:admin@mrhuo.com 備考:OAuth Appid

Contribution

  1. 開発への参加や、未完成のプラットフォームコードの貢献を歓迎します。
  2. Issueにてリクエストプラットフォームを提出してください(プラットフォームのリンクを添えて)。計画に追加します。
  3. 様々な提案を歓迎します。丁寧なコミュニケーションをお願いします。

License

Apache-2.0 License

プロジェクトアドレス

MrHuo.OAuth

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む
同じカテゴリ / 同じタグ 2026/02/07

AOTの使用経験のまとめ

プロジェクト作成当初から、新機能を追加したり新しい構文を使用したりした場合には、すぐにAOT公開テストを実施するという良い習慣を身につけるべきです。

続きを読む