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


127

首先,我将草绘我的项目:

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

我发现很难找到有关此的教程,指南或解释。我了解OAuth2以及需要执行的操作,但是我从来没有做过这样的事情,因此很难启动。我发现的最接近我需要的东西是这个github repo链接,但是解决方案未构建。

我想到的是建立一个ASP.NET MVC网站,客户(第三方)可以在该网站上注册自己并获取其客户ID。使用ASP.NET API,我想创建带有必需标记和参数的API,然后访问Dyn AX服务。

这是正确的还是我完全错了?关于构建自己的oauth2服务器/服务的任何帮助或链接都将很好。


Answers:


189

我会看的是,但从章节名称来看,我认为它也不是我要搜索的内容,因为它侧重于身份和Facebook / Google登录身份提供者。
罗宾2014年

3
只有第4部分介绍了Facebook和Google。两个月前,我根据这些教程实现了自己的身份验证控制器。而且我也使用自己的用户数据库。
MichaelS 2014年

1
我还有一个问题,这些令牌存储在哪里?身分识别完全解决这个问题吗?
罗宾2014年

17
@MichaelS感谢您提及我的博客文章,很高兴它对您的项目有所帮助:)
Taiseer Joudeh 2014年

@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 Identity或Entity Framework的方式。我见过的大多数文章都将这些与OAuth解决方案集成在一起。您的解决方案专注于OAuth和令牌的发行。非常好。也感谢您发布在您的博客上。
webworm

@Kai-在哪里Microsoft ASP.NET Identity Owin发挥作用?您是否正在使用ASP.NET Identity进行用户身份验证?如果不是,是否仍需要此NuGet软件包?
webworm

1
@webworm- app.UseOAuthBearerTokens(OAuthOptions);没有该行将无法工作Microsoft ASP.NET Identity Owin。它无法识别该方法UseOAuthBearerTokens
凯·哈特曼

缺少的软件包:Microsoft.Owin.Host.SystemWeb,Microsoft ASP.NET身份Owin
Muhammed Afsal

3
我只想添加一件事,即如果您也收到Newtonsoft.Json无效的程序集错误(在.NET 4.6及更高版本中),那么请将Newtonsoft.Json更新至版本11或更高版本。
vibs2006年


-12

Gmail:OAuth

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

全部来自Google部分。

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

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

使用您已经创建的凭据中的值更新ClientId和。ClientSecretGoogle API

  • 运行你的应用程序
  • 点击登录
  • 您将在“使用其他部分登录”部分下看到Google按钮。
  • 点击谷歌按钮
  • 应用程序将提示您输入用户名和密码
  • 输入gmail用户名和密码,然后点击登录
  • 这将执行OAuth并返回到您的应用程序,并提示您使用GmailID 注册。
  • 单击注册以将GmailID 注册到您的应用程序数据库中。
  • 您会看到身份详细信息作为普通注册显示在顶部
  • 尝试注销并通过Gmail重新登录。这将自动将您登录到应用程序。

15
用户明确表示他不想使用Facebook或Gmail登录。
Bartho Bernsmann '16

我认为没有必要对此答案投反对票。在最上面的评论上投票就足够了。该答案包含有用的信息,而答案者花费了真正的创造力来提供所述信息。Why punish that effort? 也许SO需要一种将答案标记为与OPs问题无关的方法。或者允许用户建议将其移至更恰当的问题……或根据答案创建一个新问题。
Walter Stabosz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.