【7】.net WebAPI Owin OAuth 2.0 密码模式验证实例

1.OAuth密码模式

2.在VS中创建WebAPI项目

在nuget中安装:

Microsoft.AspNet.WebApi.Owin

Microsoft.Owin.Host.SystemWeb

这两个类库并添加Owin启动类Startup

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using Microsoft.Owin.Security.OAuth;

[assembly: OwinStartup(typeof(WebAPIOAuth.Startup))]

namespace WebAPIOAuth
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var OAuthOptions = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"), //获取 access_token 授权服务请求地址
                AuthorizeEndpointPath = new PathString("/authorize"), //获取 authorization_code 授权服务请求地址
                AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(10), //access_token 过期时间

                Provider = new OpenAuthorizationServerProvider(), //access_token 相关授权服务
            };

            app.UseOAuthBearerTokens(OAuthOptions); //表示 token_type 使用 bearer 方式 不记名令牌验证
        }
    }
}

ConfigureOAuth(IAppBuilder app)方法开启了OAuth服务。简单说一下OAuthAuthorizationServerOptions中各参数的含义:

AllowInsecureHttp:允许客户端一http协议请求;

TokenEndpointPath:token请求的地址,即http://localhost:端口号/token;

AccessTokenExpireTimeSpan :token过期时间;

Provider :提供具体的认证策略;

3.继承授权服务OAuthAuthorizationServerProvider类

重载ValidateClientAuthentication方法验证客户端的正确性

重载GrantResourceOwnerCredentials方法实现用户名密码的验证,验证通过后会颁发token。

public class OpenAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {
        /// <summary>
        /// 验证调用端的clientid与clientSecret已验证调用端的合法性(clientid、clientSecret为约定好的字符串)。
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            string clientId;
            string clientSecret;
            context.TryGetBasicCredentials(out clientId, out clientSecret);
            if (clientId == "1234" && clientSecret == "5678")
            {
                context.Validated(clientId);
            }
            await base.ValidateClientAuthentication(context);
        }

        /// <summary>
        /// 通过重载GrantResourceOwnerCredentials获取用户名和密码进行认证
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            //调用后台的登录服务验证用户名与密码
            if (context.UserName != "Admin" || context.Password != "123456")
            {
                context.SetError("invalid_grant", "用户名或密码不正确。");
                return;
            }

            var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
            oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
            var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
            context.Validated(ticket);

            await base.GrantResourceOwnerCredentials(context);
        }
    }

在需要验证的方法处添加[Authorize]标签,当访问此接口时必须通过授权验证才可访问。

以上服务器端代码全部完成。

4.创建新的客户端项目进行测试

添加测试类

class OAuthClientTest
    {
        private HttpClient _httpClient;
        private string token;

        public OAuthClientTest()
        {
            _httpClient = new HttpClient();
            _httpClient.BaseAddress = new Uri("http://localhost");
        }

        public async Task<string> GetAccessToken()
        {
            var clientId = "1234";
            var clientSecret = "5678";

            var parameters = new Dictionary<string, string>();
            parameters.Add("grant_type", "password");
            parameters.Add("username", "Admin");
            parameters.Add("password", "123456");

            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                "Basic",
                Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret))
                );

            var response = await _httpClient.PostAsync("OAuthTest/token", new FormUrlEncodedContent(parameters));
            var responseValue = await response.Content.ReadAsStringAsync();
            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                return JObject.Parse(responseValue)["access_token"].Value<string>();
            }
            else
            {
                Console.WriteLine(responseValue);
                return string.Empty;
            }
        }

        public async Task Call_WebAPI_By_Resource_Owner_Password_Credentials_Grant()
        {
            if(string.IsNullOrEmpty(token))
                token = await GetAccessToken();
            Console.WriteLine(token);
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            Console.WriteLine(await (await _httpClient.GetAsync("OAuthTest/api/Values")).Content.ReadAsStringAsync());
        }
    }

main方法中调用进行测试:

static void Main(string[] args)
        {
            var clientTest = new OAuthClientTest();
            var task = clientTest.Call_WebAPI_By_Resource_Owner_Password_Credentials_Grant();
            task.Wait();
            //var token = clientTest.GetAccessToken();
            //var strToken = token.Result;
            //Console.WriteLine(strToken);
            Console.ReadLine();
        }

结果如下:

其中长串字符为token,"value1, value2"为访问webapi返回的结果,表明访问成功。

参考1:http://www.cnblogs.com/xishuai/p/aspnet-webapi-owin-oauth2.html

参考2:http://www.cnblogs.com/Leo_wl/p/4919783.html

时间: 2024-10-23 04:59:54

【7】.net WebAPI Owin OAuth 2.0 密码模式验证实例的相关文章

OWIN OAuth 2.0 Authorization Server

OWIN OAuth 2.0 Authorization Server 源码在上面的地址中可以下载 打开客户端页面http://localhost:38500/ 客户端代码引用了DotNetOpenAuth.OAuth2 public class HomeController : Controller { private WebServerClient _webServerClient; public ActionResult Index() { ViewBag.AccessToken = Re

基于OWIN WebAPI 使用OAuth授权服务【客户端验证授权(Resource Owner Password)】

RESTful API With Node.js + MongoDB http://aleksandrov.ws/2013/09/12/restful-api-with-nodejs-plus-mongodb

Security-OAuth2.0 密码模式客户端实现

我的OAuth2.0 客户端项目目录 pom 的配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mav

ASP.NET WebApi OWIN 实现 OAuth 2.0

原文:http://www.cnblogs.com/xishuai/p/aspnet-webapi-owin-oauth2.html OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的 2 小时内)内访问特定的资源(

(转)基于OWIN WebAPI 使用OAuth授权服务【客户端模式(Client Credentials Grant)】

适应范围 采用Client Credentials方式,即应用公钥.密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open API,并且需要开发者提前向开放平台申请,成功对接后方能使用.认证服务器不提供像用户数据这样的重要资源,仅仅是有限的只读资源或者一些开放的 API.例如使用了第三方的静态文件服务,如Google Storage或Amazon S3.这样,你的应用需要通过外部API调用并以应用本身而不是单个用户的身份

在OWIN WebAPI中基于OAuth授权【客户端模式(Client Credentials Grant)】

适应范围 采用Client Credentials方式,即应用公钥.密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open API,并且需要开发者提前向开放平台申请,成功对接后方能使用.认证服务器不提供像用户数据这样的重要资源,仅仅是有限的只读资源或者一些开放的 API.例如使用了第三方的静态文件服务,如Google Storage或Amazon S3.这样,你的应用需要通过外部API调用并以应用本身而不是单个用户的身份

OAuth 2.0 教程

OAuth 2.0 (原文:http://tutorials.jenkov.com/oauth2/index.html) OAuth 2.0 教程 OAuth 2.0 是一个开放的标准协议,允许应用程序访问其它应用的用户授权的数据.例如:一个游戏可以获取Facebook中的用户信息,或者是一个地理位置程序可以获取Foursquare的用户信息等. 这儿是一个示例图: 首先用户进入游戏的web应用,该应用要求用户通过Facebook账户登录,并定向到Facebook的登录界面,用户登录Facebo

ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)

相关文章:ASP.NET WebApi OWIN 实现 OAuth 2.0 之前的项目实现,Token 放在请求头的 Headers 里面,类似于这样: Accept: application/json Content-Type: application/json Authorization: Bearer pADKsjwMv927u... 虽然这是最标准的实现方式,但有时候我们会面对一些业务变化,比如 Token 要求放在 URL 或是 Post Body 里面,比如这样: https://w

在WebApi中基于Owin OAuth使用授权发放Token

如何基于Microsoft.Owin.Security.OAuth,使用Client CredentialsGrant授权方式给客户端发放access token? Client CredentialsGrant的授权方式就是只验证客户端(Client),不验证用户(Resource Owner),只要客户端通过验证就发accesstoken.举一个对应的应用场景例子,比如我们想提供一个“获取网站首页最新博文列表”的WebAPI给客户端App调用.由于这个数据与用户无关,所以不涉及用户登录与授权