我的工作任务是在我们的某个应用程序中添加外部登录。我们的想法是您可以从应用程序A登录,并使用应用程序B中的凭据登录到应用程序A.
使用应用程序B,我提供了一些API方法来验证用户,注册用户,获取密码等。我没有这个API的端点用于“令牌”#39;或者'授权' (生成Oauth_token)。
演员
客户:申请A
资源服务器:应用程序B
问题:
我是否可以实施OAuth解决方案,只能访问应用B上的一些方法?
我想我迷失了,并抓住了解决这个问题的方法。我不知道如何为此方案实现自定义OAuthService Provider。
任何人都可以对此有所了解吗?
答案 0 :(得分:1)
简答:是的,您可以使用单个控制器操作。
如果你正在使用.net mvc,那么你可以使用一个动作和不同的Id值来实现整个事物。只需使用以下格式侦听“Id”或“Token”的操作创建一个authorizationController:
https://yoursite.com/authorization/id?[params]
https://yoursite.com/authorization/token?[params]
在您的路线中,授权将解析为某个操作, id / token 将解析为ID。
参数(查询或表单发布)
然后,接受您需要的参数作为方法和过程中的(可选)参数。大多数oAuth客户端将查找初始URL和用于将其自动化代码转换为访问令牌的URL。响应是众所周知的(例如 - 我期望从你的oAuth响应中看到的数据是众所周知的),并且发布和返回的名称(例如 - type,client_id,client_secret,token,code,redirect_uri等)是也是众所周知的。
示例服务
从有充分记录的oAuth服务(如the one for basecamp)向后工作是有帮助的。在一天结束时,这就是你想要制作的东西。如果您需要第二个来源进行比较,您也可以使用zapier的oAuth2文档。
This article提供了一个很好的(基本)概述整个过程的工作原理。客户端调用,服务器返回的内容等。这是一个很好的起点。
根据需要实施“grant_types”,只记录服务器支持的消费者(或者,对于AppB的开发者)。
最后注意事项:您应该确保oAuth是正确答案。
我觉得我需要添加一个快速编辑并解释oAuth可能不是解决您所遇到的特定业务问题的正确解决方案!大多数人使用oAuth2来访问另一个应用程序的api(不是用另一个应用程序验证用户)。
oAuth.net网站说得最好:
OAuth 2.0规范定义了委托协议[...]。 OAuth的 用于各种应用,包括提供 用户认证机制。这导致了许多开发人员和 错误的API提供商断定OAuth本身就是一个 身份验证协议,并错误地使用它。
如果您打算尝试验证用户,那么oAuth2可能是错误的解决方案。
答案 1 :(得分:1)
资源服务器不会发出令牌。授权服务器发出令牌。
您需要一个授权服务器,它通过令牌端点和一些验证令牌的机制发出令牌。如果您可以修改应用程序B以获得令牌端点,那么它可以充当您的授权服务器。如果不能,则可以使用令牌端点构建另一个应用程序作为授权服务器。此新应用程序将在应用程序B上调用“验证用户”以验证用户凭据并在令牌有效时发出令牌。
假设应用程序A受应用程序B信任(例如:您的公司拥有并维护这两个应用程序),您可以通过使用OAuth的resource owner flow来获得令牌端点。
答案 2 :(得分:1)
请查看本教程,该教程非常容易理解。 http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
要在应用程序A中实现自定义OAuthAuthorizationServerProvider,请查看上面教程中的步骤10并尝试以下内容:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
if(!ApplicationB.Validate(username, password))
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
// add new claims relevant for your identity (ex: PortalAlias)
context.Validated(identity);
}
然后在Application A Web API控制器中只包装对Application B API的调用