【问题标题】:How to implement oauth2 server in ASP.NET MVC 5 and WEB API 2 [closed]如何在 ASP.NET MVC 5 和 WEB API 2 中实现 oauth2 服务器 [关闭]
【发布时间】:2015-01-01 13:10:30
【问题描述】:

首先我将绘制我的项目:

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

我发现很难找到这方面的教程、指南或解释。我了解 OAuth2 以及需要做什么,但我以前从未做过这样的事情,并且很难开始。我找到的最接近我需要的是这个github repo link,但没有构建解决方案。

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

这是对的还是我完全错了?任何有关构建您自己的 oauth2 服务器/服务的帮助或链接都会很好。

【问题讨论】:

标签: asp.net oauth-2.0 asp.net-mvc-5 asp.net-web-api2


【解决方案1】:

【讨论】:

  • 我会看的是,但从章节名称来看,我认为这又不是我搜索的内容,因为它侧重于身份和 facebook/google 登录身份提供者。
  • 只有第 4 部分是关于 facebook 和 google 的。两个月前,我根据这些教程实现了自己的身份验证控制器。我也在使用我自己的用户数据库。
  • 我还有一个问题,这些令牌存储在哪里? Identity 会完全解决这个问题吗?
  • @MichaelS 感谢您参考我的博客文章,很高兴它对您的项目有所帮助 :)
  • @MichaelS 我怀疑基于 Token 的身份验证方式对于其余 api 是否足够安全。因为如果我可以在他的浏览器中获取用户的令牌。我认为可以实现,因为令牌存储在请求头 Authentication 中。我可以做任何我想做的事情,比如获取/发布/放置/删除。
【解决方案2】:

我也很难找到有关如何生成令牌部分的文章。我从来没有找到过自己写的。所以,如果它有帮助:

要做的事情是:

  • 创建一个新的网络应用程序
  • 安装以下 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);
        }
    }
}

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

【讨论】:

  • 我真的很喜欢你没有引入 ASP 身份或实体框架。我见过的大多数文章都将这些与 OAuth 解决方案集成在一起。您的解决方案侧重于 OAuth 和令牌的颁发。很不错。也感谢您在您的博客上发帖。
  • @Kai - Microsoft ASP.NET Identity Owin 在哪里发挥作用?您是否使用 ASP.NET Identity 进行用户身份验证?如果没有,是否还需要这个 NuGet 包?
  • @webworm - 如果没有Microsoft ASP.NET Identity Owinapp.UseOAuthBearerTokens(OAuthOptions); 行将无法工作。它无法识别方法UseOAuthBearerTokens
  • 缺少包:Microsoft.Owin.Host.SystemWeb、Microsoft ASP.NET Identity Owin
  • 我只想添加一件事,即如果您也遇到 Newtonsoft.Json 无效程序集错误(在 .NET 4.6 及更高版本中),那么请将 Newtonsoft.Json 更新到版本 11 或更高版本。
【解决方案3】:

我正在研究同样的事情,偶然发现了identityserver,它在 ASP.NET 之上实现了 OAuth 和 OpenID。它与ASP.NET identityMembership Reboot 集成,并为实体框架提供持久性支持。

所以,要回答您的问题,请查看他们在 how to setup an OAuth and OpenID server 上的详细文档。

【讨论】:

    【解决方案4】:

    Gmail:OAuth

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

    这些都来自 Google 部分。

    回到你的应用程序,打开App_start/Startup.Auth.cs并取消注释以下sn-p

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

    使用您已经创建的 Google API 凭据中的值更新 ClientIdClientSecret

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

    【讨论】:

    • 用户明确表示他不想使用 Facebook 或 Gmail 登录。
    • 我认为没有必要对这个答案投反对票。对最高评论的支持就足够了。该答案包含有用的信息,并且回答者花费了真正的创造性努力来提供所述信息。 Why punish that effort? 也许 SO 需要一种方法来将答案标记为与 OP 问题不一致。或者允许用户建议将其移至更合适的问题......或从答案中创建一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多