前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET 项目集成 OAuth2 登录最全面的、最方便的框架

.NET 项目集成 OAuth2 登录最全面的、最方便的框架

作者头像
沙漠尽头的狼
发布2022-04-18 20:24:24
1K0
发布2022-04-18 20:24:24
举报
文章被收录于专栏:Dotnet9Dotnet9

MrHuo.OAuth

是 .NET 项目集成 OAuth2 登录最全面的、最方便的框架

.NET Core 项目或 .NET Framework 4.6 项目均可使用

体验网址:https://oauthlogin.net/[1]

计划

  • 飞书
  • 淘宝
  • 西瓜
  • 今日头条
  • 人人网
  • Teambition
  • Pinterest
  • Twitter
  • 企业微信二维码登录
  • 企业微信网页登录
  • 酷家乐
  • 饿了么
  • 京东
  • 喜马拉雅...

使用方法

新建项目web项目,安装 nuget 包即可使用。

现可用的 nuget 包列表如下:

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

Gitlab
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Gitlab -Version 1.1.1
微信公众号
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Wechat -Version 1.1.1
oschina.net
代码语言:javascript
复制
Install-Package MrHuo.OAuth.OSChina -Version 1.1.1
coding.net
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Coding -Version 1.1.1
github.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Github -Version 1.1.1
alipay.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Alipay -Version 1.1.1
baidu.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Baidu -Version 1.1.1
huawei.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Huawei -Version 1.1.1
gitee.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Gitee -Version 1.1.1
weibo.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.SinaWeibo -Version 1.1.1
xunlei.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.XunLei -Version 1.1.1
qq.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.QQ -Version 1.1.1
microsoft.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Microsoft -Version 1.1.1
mi.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Mi -Version 1.1.1
stackoverflow.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.StackOverflow -Version 1.1.1
facebook.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Facebook -Version 1.1.1
google.com
代码语言:javascript
复制
Install-Package MrHuo.OAuth.Google -Version 1.0.0
  1. Startup.cs
代码语言:javascript
复制
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 方式引入,提供了一个快捷方法从配置中加载。

代码语言:javascript
复制
OAuthConfig.LoadFrom(Configuration, "oauth:baidu")

"oauth:baidu" 这部分是配置前缀,配置格式如下:

代码语言:javascript
复制
{
  "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 根据实际需要自行命名
代码语言:javascript
复制
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
代码语言:javascript
复制
<!--在代码中放置授权按钮-->
<a href="/oauth/baidu">Baidu 登录</a>
<a href="/oauth/wechat">Wechat 扫码登录</a>
<!-- //其他登录方式照样子往下写 -->

扩展

扩展其他平台非常容易,拿 Gitee 平台的代码来说:https://github.com/mrhuo/MrHuo.OAuth/tree/main/MrHuo.OAuth.Gitee[6]

第一步:找平台对应 OAuth 文档,找到获取用户信息接口返回JSON,转换为 C# 实体类。如下:

根据自己需要和接口标准,扩展用户属性

代码语言:javascript
复制
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; }

    //...其他属性类似如上
}
第二步:写对应平台的授权接口
代码语言:javascript
复制
/// <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";
}

加上注释,总共十行,如你所见,非常方便。如果该平台协议遵循 OAuth2 标准开发,那么就这么几行就好了。

就连修改字段的微信登录实现,也不过复杂,只需要定义基本参数就OK。代码如下:

代码语言:javascript
复制
/// <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[7]
  3. feng lui[8]

为了能让各位朋友能顺利的使用各种平台登录组件,先急求各种平台的 APPID 做测试,有这方面资源的朋友联系我。提供测试的朋友,可以永久出现在项目首页特别贡献列表里,可带链接。

邮件:admin@mrhuo.com 备注:OAuth Appid

Contribution

1.欢迎参与开发,贡献其他未完成平台代码。2.欢迎在 issue 里提交需求平台,带上平台链接地址,我们将加入到计划之中。3.欢迎提交各种建议,文明交流。

License

Apache-2.0 License

项目地址

  • 框架名:MrHuo.OAuth
  • 作者:mrhuo
  • Github:https://github.com/mrhuo/MrHuo.OAuth[9]

MrHuo.OAuth

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet9 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MrHuo.OAuth
    • 计划
      • 使用方法
        • 扩展
          • 特别贡献
            • Contribution
              • License
                • 项目地址
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档