一。实现继承自OAuthAuthorizationServerProvider的类,实现以“客户端验证”方式传入的相关认证和access_token发放。

public class MyOwnOAuthProvider:OAuthAuthorizationServerProvider
{ private static readonly Logger logger = LogManager.GetLogger("MyOwnOAuth");
/// <summary>
/// 客户端认证
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId;
string clientSecret; //获取客户端传入的用户名和密码
context.TryGetFormCredentials(out clientId,out clientSecret); logger.Info("用户名:"+clientId+" 密码:"+clientSecret+" 登陆网站..."); //可以使用自己的数据验证,如通过数据库查询等方式
if (clientId == "MyOwnApp" && clientSecret == "ctmdsh!320")
{
context.Validated(clientId);
} return base.ValidateClientAuthentication(context);
} /// <summary>
/// 方法中对客户端进行授权 授权后发放access token
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)
{ var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
oAuthIdentity.AddClaim(new Claim("MyOwnApp", "ljx"));
//API中可以使用一下方法获取其中的值。
// var identity = (ClaimsIdentity)User.Identity;
//var mayiAccount = identity.FindFirstValue("MyOwnApp");
var ticket = new AuthenticationTicket(oAuthIdentity,new AuthenticationProperties());
context.Validated(ticket); logger.Info("已对用户Ljx发放access_token..."); return base.GrantClientCredentials(context);
}
}

  

重载ValidateClientAuthentication方法,实现客户端验证,重载GrantClientCredentials方法,实现access_token的发放。

二。通过相关配置,设置自己创建的Provider为Authroize的处理类。
1.在App_start文件夹中找到Startup.Auth,找到OAuthOptions方法,修改对应的Provider完成配置:
    OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new MyOwnOAuthProvider(),
// AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
//在生产模式下设 AllowInsecureHttp = false
AllowInsecureHttp = true
};

  

MyOwnOAuthProvider处替换为我们自己创建的验证逻辑类即可。

三。在api中对controller或者action加入[Authorize]属性即可。

四。注意如果要实现跨域访问,需要在Startup.Auth文件的ConfigureAuth方法中加入
app.UseCors(CorsOptions.AllowAll);

  当然,需要首先使用Nuget安装Microsoft.Owin.Cors的引用。

五。在客户端实现响应的调用。

1.设置$.ajax的提交之前的处理方法:

$(function () {

    $.ajaxSetup({
cache: false,
beforeSend: function (xhr, option) { var opentId = "MyOwnApp";
var openSecret = "ctmdsh!320"; // alert("start"); $.ajax({
type: 'post',
async: false,
url: hosturl + "token",
data: {
client_id: opentId,
client_secret: openSecret,
grant_type: "client_credentials"
},
tokenSkip: true,
success: function (data) { xhr.setRequestHeader("Authorization", "Bearer " + data.access_token); } }); } },
complete: function () { },
error: function (a) { if (typeof console.log === "function") { console.log(a.responseText);
} } }); })

  

client_id指明用户,client_secret指明密码,grant_type: "client_credentials"指明验证方式。

2.在对应页面直接调用响应的API接口即可。
    $(function () {

        $.ajax({
type:"get", url: "http://localhost:51067/api/values", success: function (data) {
alert(data);
}
}); })

  

												

Asp.net Api中使用OAuth2.0实现“客户端验证”的更多相关文章

  1. 在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client

    在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client   阅读目录 验证代码流程 Refreshing a Token Built-In Providers 这个包能够让你 ...

  2. 在ASP.NET中实现OAuth2.0(一)之了解OAuth

    1.什么是OAuth2.0 是一个开放授权标准,允许用户让第三方应用访问该用户在某一个网站或平台上的私密资源(如照片.视频.联系人等),而无须将用户名和密码提供给第三方应用 2.OAuth2.0授权模 ...

  3. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  4. ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  5. Spring Cloud 微服务中搭建 OAuth2.0 认证授权服务

    在使用 Spring Cloud 体系来构建微服务的过程中,用户请求是通过网关(ZUUL 或 Spring APIGateway)以 HTTP 协议来传输信息,API 网关将自己注册为 Eureka ...

  6. IdentityServer4:IdentityServer4+API+Client实践OAuth2.0客户端模式(1)

    一.OAuth2.0 1.OAuth2.0概念 OAuth2.0(Open Authorization)是一个开放授权协议:第三方应用不需要接触到用户的账户信息(如用户名密码),通过用户的授权访问用户 ...

  7. RESTful API架构和oauth2.0认证机制(概念版)

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  8. [PHP] 调用微博API 发微博OAuth2.0

    在实际测试中出现很多问题, 第一就是按照文档调用ACCESS_TOKEN的时候费老劲啦,因为是编辑线上的,有好多中文空格,没有看出来!整了好久! 第二个就是在调用api发微博的时候出现乱码!必须把发送 ...

  9. 再说表单验证,在Web Api中使用ModelState进行接口参数验证

    写在前面 上篇文章中说到了表单验证的问题,然后尝试了一下用扩展方法实现链式编程,评论区大家讨论的非常激烈也推荐了一些很强大的验证插件.其中一位园友提到了说可以使用MVC的ModelState,因为之前 ...

随机推荐

  1. java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用

    写的非常棒的一篇总结: http://blog.csdn.net/speedme/article/details/22398395#t1 下面主要看各个集合如何使用迭代器Iterator获取元素: 1 ...

  2. mongodb 面试题总结

    mongodb 面试题总结 1 nosql和关系型数据库的区别 2 nosql数据库有哪些 redis mongodb hbase 3 MySQL与mongodb本质之间最基本的差别是什么 差别在多方 ...

  3. InnoDB Undo Log

    简介 Undo Log包含了一系列在一个单独的事务中会产生的所有Undo Log记录.每一个Undo Log记录包含了如何undo事务对某一行修改的必要信息.InnoDB使用Undo Log来进行事务 ...

  4. Hex to Int 【十六进制转十进制】

    long HexToInt(char *msgline){    long strlength,chvalue,tvalue;    WORD i;    chvalue=0;    strlengt ...

  5. 增大hadoop client内存

    export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS" 问题场景:sqoop import时报OOM

  6. 关于 LindedList 我想说

    LinkedList 的一些认识: 继承于AbstractSequentialList的双向链表,可以被当作堆栈.队列或双端队列进行操作 有序,非线程安全的双向链表,默认使用尾部插入法 适用于频繁新增 ...

  7. Elevator poj3539

    Elevator Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 1072   Accepted: 287 Case Time ...

  8. Two-phase clustering process for outliers detection 文章翻译

    基于二阶段聚集模式的异常探测 M.F .Jiang, S.S. Tseng *, C.M. Su 国立交通大学计算机与信息科学系,中国台北市新竹路100150号 1999年11月17日; 2000年4 ...

  9. c#中list使用示例

    protected void Page_Load(object sender, EventArgs e) { List<string> studentNames = new List< ...

  10. 59、jQuery初识

    jQuery是由原生js写的所以说所有jQuery制作出来的效果都可以使用js做出来,jQuery出现的目的是为了优化代码,提高码代码的效率它将很多功能封装. 一.jQuery的认识 1.何为jque ...