在ASP.NET Web API2 Web服务中实现OAuth访问令牌

Jen*_*nan 8 c# asp.net web-services oauth asp.net-web-api2

我使用ASP.NET Web API并使用jquery ajax方法.

我想使用OAuth访问令牌创建安全的Web服务.

如何将OAuth2实现为ASP.NET Web API2 Web服务?

我想在不登录的情况下阻止使用Web服务 - 没有访问令牌.

有一个示例项目实现oauth2到Web服务?

WebApi控制器例如:

public class GetDataController : ApiController
{
    public string Get(int id, string accessToken)
    {

        //Check access token
        //How can I implementing this logic for authorization valid access token
        if (accessToken == isInvalid)
        {
            return "Access denied";
        }

        //If accessToken is valid return value
        return "value";
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

$.get( "api/getdata", { id: 1, accessToken: "KEY" } )
.done(function( data ) {
alert( "Data Loaded: " + data );
});
Run Code Online (Sandbox Code Playgroud)

Jer*_*čki 20

最简单的方法是从新的Visual Studio 2013 ASP.NET Web应用程序模板开始.在" 新建ASP.NET项目 "对话框中选择" Web API ",然后单击" 更改身份验证 "按钮并选择" 个人用户帐户 " 选项,如下图所示:

Web API更改身份验证

这将创建一个项目,该项目使用具有承载令牌OAuth实现的新ASP.NET成员资格"家庭成员" ASP.NET身份.

您需要注意的是以下类:

App_Start-> Startup.Auth.cs

令牌认证由OWIN中间件处理,这是配置管道的代码.最重要的是调用UseOAuthBearerTokens,它将启用3个OWIN中间件组件授权服务器中间件,应用程序承载令牌中间件,外部承载令牌中间件.你可能不需要最后一个.

App_Start-> IdentityConfig.cs

默认情况下,ASP.NET Identity使用Entity Framework作为存储提供程序(用户,角色,声明持久性).如果您不使用EF,则必须切换到另一个存储提供程序或使用几个接口自行实现.ASP.NET身份的自定义存储提供程序概述.

提供者 - > ApplicationOAuthProvider.cs

OWIN中间件将使用适当的标头处理每个请求.下面是验证HTTP标头中针对存储提供程序提供的用户名和密码的代码,并返回将附加到每个后续HTTP请求的标记.

验证工作流程

  1. 首先,您需要获取安全令牌.这是OAuth授权服务器的任务.令牌端点配置为存在于http://yourSite/Token.要获取令牌,您需要编写一个特殊的HTTP标头(使用Fiddler测试它).前3行应该转到POST请求头,最后一行应该请求正文.

    Host: yoursite
    Content-Type: application/json;charset=UTF-8
    Content-Length: 51
    
    grant_type=password&username=xxxxxx&password=xxxxxx
    
    Run Code Online (Sandbox Code Playgroud)

    如果凭据正常,您将收到以下响应.保存access_token值,以便在步骤2中使用它:

    .expires=Tue, 17 Jun 2014 22:11:12 GMT
    .issued=Tue, 03 Jun 2014 22:11:12 GMT
    access_token=c-D34PHKFGaPthuF2sIwmeowXYAPFiSPsMH...
    expires_in=1209599
    token_type=bearer
    userName=xxxxxxx
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用jQuery为安全资源编写适当的GET请求(使用show response查看整个响应):

    var getData = function(){
    var url = "http://yoursite/api/protectedResource/";
    $.ajax(url,{
    type: "GET",
    headers: "Authorization" : "Bearer " + accessToken
    }).always(showResponse);
    return false;
    };
    
    Run Code Online (Sandbox Code Playgroud)

我希望这能让你开始.