OAuth(Open Authorization)

为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。

本节目录:

Owin下WebAPI SelfHost

1.创建一个控制台项目(其实类库都可以)ApiServer

Nuget引用:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

或者引用以下三个

Install-Package Microsoft.AspNet.WebApi.Owin (让WebApi作为中间件)
Install-Package Microsoft.Owin.Hosting (Hosting接口默认使用HttpListener作为Server)
Install-Package Microsoft.Owin.Host.HttpListener (默认的Server实现)

2.添加Startup类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void Configuration(IAppBuilder app)
{
    // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
    ApiConfig(app);
}
 
 
private static void ApiConfig(IAppBuilder app)
{
    var config = new HttpConfiguration();
 
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional , action = RouteParameter.Optional }
        );
 
    app.UseWebApi(config);
}

如何让Owin关联到Startup类的方法,可以看我的博客:

[ASP.NET] 下一代ASP.NET开发规范:OWIN

3.创建一个Api控制器

1
2
3
4
5
6
7
public class ValuesController : ApiController
{
    public string Get()
    {
        return "Never、C";
    }
}

4.Main方法启动

1
2
3
4
5
6
7
8
9
static void Main(string[] args)
{
    const string url = "http://localhost:1234/";
    using (WebApp.Start<Startup>(url))
    {
        Console.WriteLine("开启成功");
        Console.ReadLine();
    }
}

5.浏览器访问

创建AccessToken

在上面的Owin Web API的基础上,开始实现OAuth.

Nuget:

Install-Package Microsoft.Owin.Security.OAuth(owin的oauth的实现)

使用OAuth会要求Owin使用UseOAuthBearerTokens认证方式,所以引用

Install-Package Microsoft.AspNet.Identity.Owin

1.在Startup添加一个中间件配置

1
2
3
4
5
6
7
8
9
10
11
private static void OAuthConfig(IAppBuilder app)
    {
        var OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/token"),
            Provider = new OTWAuthorizationServerProvider(),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true,
        };
        app.UseOAuthBearerTokens(OAuthOptions);
    }

并且设置Web API使用OAuth

1
2
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); //添加的配置
app.UseWebApi(config);

  

2.自定义的provider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class OTWAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    //1.验证客户
    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {<br>       //此处可以判断client和user <br>
        //this.ClientId = clientId;
        //this.IsValidated = true;
        //this.HasError = false;
        context.Validated("自定义的clientId");
        return base.ValidateClientAuthentication(context);
    }
    //授权客户
    public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)
    {
        var ticket = new AuthenticationTicket(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "Never、C") }, context.Options.AuthenticationType), null);
        //this.Ticket = ticket;
        //this.IsValidated = true;
        //this.HasError = false;
        context.Validated(ticket);
        return base.GrantClientCredentials(context);
    }
}

3.用客户端来调用我们的(建议不要用单元测试,此处新建一个控制台项目)

1
2
3
4
5
6
7
static void Main(string[] args)
{
    const string url = "http://localhost:1234/";
    var client = new HttpClient();
    var rst = client.PostAsync(url + "token"new StringContent("grant_type=client_credentials")).Result.Content.ReadAsStringAsync().Result;
    Console.WriteLine(rst);
}

  

4.先启动服务端,再启动客户端

使用AccessToken

1.ValuesController添加特性Authorize

1
2
3
4
5
6
7
8
[Authorize]
public class ValuesController : ApiController
{
    public string Get()
    {
        return User.Identity.Name;
    }
}

访问会返回

{"Response status code does not indicate success: 401 (Unauthorized)."}

2.客户端引用

Install-Package Newtonsoft.Json -Version 7.0.1

3.修改Main方法,带上Token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Program
{
    static void Main(string[] args)
    {
        const string url = "http://localhost:1234/";
        var client = new HttpClient();
        var rst = client.PostAsync(url + "token"new StringContent("grant_type=client_credentials")).Result.Content.ReadAsStringAsync().Result;
        var obj = JsonConvert.DeserializeObject<Token>(rst);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", obj.AccessToken);
        rst = client.GetStringAsync(url + "api/values").Result;
        Console.WriteLine(rst);
        Console.ReadLine();
    }
}
 
public class Token
{
    [JsonProperty("Access_Token")]
    public string AccessToken { getset; }
}

  

4.先启动服务端,再启动客户端

扩展

其实OAuth自己也能实现,本质是生成一个加密的唯一的字符串

OAuth的实现方案还有DotNetOpenAuth、Thinktecture IdentityServer

本文地址:http://neverc.cnblogs.com/p/4970996.html

参考:

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

http://www.cnblogs.com/dudu/p/4569857.html

Web API在OWIN下实现OAuth的更多相关文章

  1. [ASP.NET] 结合Web API在OWIN下实现OAuth

    OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码), ...

  2. ASP.NET Web API与Owin OAuth:调用与用户相关的Web API

    在前一篇博文中,我们通过以 OAuth 的 Client Credential Grant 授权方式(只验证调用客户端,不验证登录用户)拿到的 Access Token ,成功调用了与用户无关的 We ...

  3. ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API

    在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization ...

  4. 为IIS Host ASP.NET Web Api添加Owin Middleware

    将OWIN App部署在IIS上 要想将Owin App部署在IIS上,只添加Package:Microsoft.OWIN.Host.SystemWeb包即可.它提供了所有Owin配置,Middlew ...

  5. ASP.NET Web API与Owin OAuth:调用与用户相关的Web API(非第三方登录)

    授权完成添加属性 ClaimsIdentity oAuthIdentity = await CreateAsync(user/*userManager*/, OAuthDefaults.Authent ...

  6. Web API使用记录系列(三)Web API与Owin

    还好在坚持,今天继续更新第三篇随笔----使用owin来启动WebAPI(这里还是以IIS为宿主,当然也可以使用别的如Console.Windows Server等) 关于OWIN(Open Web ...

  7. 在ASP.NET Web API 2中使用Owin OAuth 刷新令牌(示例代码)

    在上篇文章介绍了Web Api中使用令牌进行授权的后端实现方法,基于WebApi2和OWIN OAuth实现了获取access token,使用token访问需授权的资源信息.本文将介绍在Web Ap ...

  8. 在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份 ...

  9. Web API与OAuth:既生access token,何生refresh token

    在前一篇博文中,我们基于 ASP.NET Web API 与 OWIN OAuth 以 Resource Owner Password Credentials Grant 的授权方式( grant_t ...

随机推荐

  1. web前端学习笔记---实现雪花飘落的效果

    看了javascript网页特效实例大全中的图片飘下的效果实例,觉得值得动手学习下. 就把图片改成雪花图,完成一个雪花飘下的效果. 并且,其中有些内容比较陈旧了,那么就学者改掉吧. 包括: 1.对le ...

  2. Spring @Transactional propagation 各个属性值的含义

    REQUIRED:业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. NOT_SUPPORTED:声明方法不需要事务.如果方法没有关联到一 ...

  3. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  4. [Asp.net 5] Configuration-新一代的配置文件(神奇的Binder)

    关于配置文件的目录:[Asp.net 5] Configuration-新一代的配置文件 之前看过MVC4.0的源码,里面就有Binder.作用是将前台页面传递过来的键值对/字典表绑定到特定的对象.此 ...

  5. C# 委托和事件(一):最简单的委托和事件

    C#的事件基于委托,所以先说委托. 一切脱离实际场景的抽象概念新手看上去就像是在扯犊子,不错,我就是个新手.所以我需要一个实际的场景. 明天刚好考试(商务英语),考试上有两个角色(class):老师( ...

  6. PHP中用GD绘制饼图

    PHP中用GD绘制饼图,绘制的类见代码: Class Chart{ private $image; // 定义图像 private $title; // 定义标题 private $ydata; // ...

  7. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  8. strtr和str_replace字符替换函数

    (一)strtr是字符替换函数 (1)单个字符替换: <?php echo strtr("abba", "ab", "10"),&qu ...

  9. Linux下安装mongodb详细过程

    本次安装mongodb使用yum.repo方式.详细过程请参考,也列出一些安装过程中的错误,欢迎指正. mongodb版本:3.0 先在linux下cd 到 /etc/yum.repos.d/ 新建脚 ...

  10. SQL join中on与where区别

    本文导读: 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.例如在使用left jion时,on条件是在生成临时表时使用的条件,它不管on中的条件是否 ...