如何在ASP.NET MVC 5和WEB API 2中实现oauth2服务器

137

首先我会简要介绍我的项目:

我的实习需要为一个现有系统添加功能。一旦用户通过OAuth2授权,第三方客户端必须能够从AX Web服务中访问数据。我知道我需要创建一个“代理Web服务”,客户端可以对其进行调用,然后调用AX服务,但我对OAuth2部分有点不确定。大多数教程和指南都是关于使用ASP.NET的Identity进行Facebook或Google登录。我不需要那个,我需要使用现有凭据,因此我需要制作自己的OAuth2服务。

我很难找到关于这个的教程、指南或解释。我了解OAuth2以及需要做什么,但我以前从未做过这样的事情,很难开始。我找到的与我需要的最接近的东西是这个Github存储库链接,但该解决方案无法构建。

我想制作一个ASP.NET MVC网站,让客户端(第三方)可以注册并获取他们的客户端ID。然后,我想使用ASP.NET API创建API,以获取所需的令牌和参数,然后访问Dyn AX服务。

这是否正确,或者我完全错了?任何关于如何构建自己的OAuth2服务器/服务的帮助或链接都会很好。


http://leastprivilege.com/2013/11/13/embedding-a-simple-usernamepassword-authorization-server-in-web-api-v2/ - pomber
4个回答

199

3
只有第四部分涉及 Facebook 和 Google。两个月前,我根据这些教程实现了自己的身份验证控制器,并且我也在使用自己的用户数据库。 - MichaelS
1
我还有一个问题,这些令牌存储在哪里?身份验证是否完全负责此事? - Robin
18
@MichaelS 感谢您参考我的博客文章,很高兴它对您的项目有所帮助 :) - Taiseer Joudeh
@Joe.wang 你说得对。但是它比cookies更安全。Tokens可以防止CSRF攻击,而cookies则不能。 - MichaelS
@MichaelS 感谢您的回复。最近我一直在寻找比基于令牌的方式更安全的方法。问题是托管RESTful API的服务器只能使用用户凭据对客户端进行身份验证。但这就是全部,它并不关心请求是否来自发起令牌请求的客户端。对吧?谢谢。 - Joe.wang
显示剩余11条评论

94

我也曾苦苦寻找如何仅生成token部分的文章,但没有找到,于是我自己写了一篇。所以如果有帮助的话:

需要做的事情是:

  • 创建一个新的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&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);
        }
    }
}

运行您的项目。令牌应该出现在弹出窗口中。


7
我很喜欢你没有使用ASP身份验证或实体框架。我看到的大多数文章都将它们与OAuth解决方案集成在一起。你的解决方案专注于OAuth和令牌的发放。非常好。同时也感谢你在博客上发布这篇文章。 - webworm
@Kai - Microsoft ASP.NET Identity Owin 在哪里发挥作用?你是否使用 ASP.NET Identity 进行用户认证?如果没有,那么这个 NuGet 包是否仍然需要? - webworm
1
@Webworm - 如果没有安装 Microsoft ASP.NET Identity Owin,那么这行代码 app.UseOAuthBearerTokens(OAuthOptions); 将无法工作。因为它无法识别方法 UseOAuthBearerTokens - Kai Hartmann
缺少的包:Microsoft.Owin.Host.SystemWeb,Microsoft ASP.NET Identity Owin。 - Muhammed Afsal
3
我只想补充一件事,即如果您在使用 .NET 4.6 及以上版本时也遇到了 Newtonsoft.Json 无效程序集错误,请将 Newtonsoft.Json 更新至 11 版本或更高版本。 - vibs2006

5

-10

Gmail:OAuth

  • 前往链接
  • 使用您的Gmail用户名和密码登录。
  • 点击左上角的Google菜单。
  • 点击API管理器。
  • 点击凭据。
  • 点击创建凭据并选择OAuth客户端。
  • 将应用程序类型选择为Web应用程序,并输入名称->输入授权重定向URL (例如:http://localhost:53922/signin-google) -> 点击创建按钮。这将创建凭据。请记录下客户端ID秘密ID。最后,点击确定以关闭凭据弹窗。
  • 接下来的重要步骤是启用Google API。点击左窗格中的概述。
  • 在社交API部分下,点击Google API
  • 点击启用。

这就是来自Google的全部内容。

回到你的应用程序,打开App_start/Startup.Auth.cs并取消注释以下代码片段

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

更新ClientIdClientSecret,将其值替换为您已创建的Google API凭据的值。

  • 运行您的应用程序
  • 单击登录
  • 您将在“使用其他部分登录”下看到 Google 按钮
  • 单击 Google 按钮
  • 应用程序将提示您输入用户名和密码
  • 输入 Gmail 用户名和密码,然后单击登录
  • 这将执行 OAuth 并返回您的应用程序,并提示您使用Gmail id进行注册。
  • 单击注册以将Gmail id注册到您的应用程序数据库中。
  • 您将看到身份详细信息与普通注册一样出现在顶部
  • 尝试通过 Gmail 登出并重新登录。这将自动将您登录到应用程序中。

16
用户明确表示不想使用Facebook或Gmail账户登录。 - Bartho Bernsmann
1
我不认为有必要对这个回答进行负评。顶部评论的点赞就足够了。这个回答包含有用的信息,回答者花费了真正的创造性努力来提供这些信息。”为什么要惩罚这种努力呢?也许 SO 需要一种方式来标记一个回答与 OP 的问题不符。或者允许用户建议将其移动到更合适的问题... 或从答案中创建一个新的问题。 - Walter Stabosz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接