OAuth - 我的资源服务器是否需要端点'授权'和#39;令牌'

时间:2016-01-29 22:12:59

标签: c# .net angularjs asp.net-mvc oauth

我的工作任务是在我们的某个应用程序中添加外部登录。我们的想法是您可以从应用程序A登录,并使用应用程序B中的凭据登录到应用程序A.

使用应用程序B,我提供了一些API方法来验证用户,注册用户,获取密码等。我没有这个API的端点用于“令牌”#39;或者'授权' (生成Oauth_token)。

演员

客户:申请A

资源服务器:应用程序B

问题:

我是否可以实施OAuth解决方案,只能访问应用B上的一些方法?

我想我迷失了,并抓住了解决这个问题的方法。我不知道如何为此方案实现自定义OAuthService Provider。

任何人都可以对此有所了解吗?

3 个答案:

答案 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的调用