如何在 ASP.NET MVC 5 和 WEB API 2 中实现 oauth2 服务器 [关闭]
Posted
技术标签:
【中文标题】如何在 ASP.NET MVC 5 和 WEB API 2 中实现 oauth2 服务器 [关闭]【英文标题】:How to implement oauth2 server in ASP.NET MVC 5 and WEB API 2 [closed] 【发布时间】: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 服务器/服务的帮助或链接都会很好。
【问题讨论】:
leastprivilege.com/2013/11/13/… 【参考方案1】:Taiseer Joudeh 有一篇精彩的博文,其中包含详细的分步说明。
-
Part 1: Token Based Authentication using ASP.NET Web API 2, Owin, and Identity
Part 2: AngularJS Token Authentication using ASP.NET Web API 2, Owin, and Identity
Part 3: Enable OAuth Refresh Tokens in AngularJS App using ASP .NET Web API 2, and Owin
Part 4: ASP.NET Web API 2 external logins with Facebook and Google in AngularJS app
Part 5: Decouple OWIN Authorization Server from Resource Server
【讨论】:
我会看的是,但从章节名称来看,我认为这又不是我搜索的内容,因为它侧重于身份和 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 Owin
,app.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 identity 和Membership Reboot 集成,并为实体框架提供持久性支持。
所以,要回答您的问题,请查看他们在 how to setup an OAuth and OpenID server 上的详细文档。
【讨论】:
【参考方案4】:Gmail:OAuth
转到link 使用您的 gmail 用户名密码登录 点击左上角的谷歌菜单 点击 API 管理器 点击凭据 点击创建凭据并选择 OAuth 客户端 选择Web应用程序作为应用程序类型并输入名称->输入授权重定向URL(例如:http://localhost:53922/signin-google)->单击创建按钮。这将创建凭据。请记下Client ID
和Secret ID
。最后单击“确定”关闭凭据弹出窗口。
下一个重要步骤是启用Google API
。点击左侧窗格中的概览。
点击社交 API 部分下的 Google API
。
点击启用。
这些都来自 Google 部分。
回到你的应用程序,打开App_start/Startup.Auth.cs
并取消注释以下sn-p
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
ClientId = "",
ClientSecret = ""
);
使用您已经创建的 Google API
凭据中的值更新 ClientId
和 ClientSecret
。
Gmail
id 进行注册。
点击注册,将Gmail
id 注册到您的应用程序数据库中。
您将在正常注册时看到身份详细信息显示在顶部
尝试注销并通过 Gmail 重新登录。这将自动将您登录到应用程序。
【讨论】:
用户明确表示他不想使用 Facebook 或 Gmail 登录。 我认为没有必要对这个答案投反对票。对最高评论的支持就足够了。该答案包含有用的信息,并且回答者花费了真正的创造性努力来提供所述信息。Why punish that effort?
也许 SO 需要一种方法来将答案标记为与 OP 问题不一致。或者允许用户建议将其移至更合适的问题......或从答案中创建一个新问题。以上是关于如何在 ASP.NET MVC 5 和 WEB API 2 中实现 oauth2 服务器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Web API 添加到现有的 ASP.NET MVC (5) Web 应用程序项目中?
如何在 ASP.NET Core MVC 中请求和显示实时 Web api 数据?
如何在 ASP.NET 5 MVC 6 (vNext) 中定义 Identity 的密码规则?