• Asp.net Api中使用OAuth2.0实现“客户端验证”


    一。实现继承自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);
                }
            });
    
    
        })
    

      





  • 相关阅读:
    除下草并推荐PhantomJS
    GTAC 2013
    Benchmark感受
    ChinaTest第二天
    "西厂"、"东厂"照片
    谈面试上
    mysql基本常用命令(转)
    java学习笔记数据类型、运算符和控制语句
    java学习笔记第一个applet程序以及一个小问题的解决
    网上阅卷系统自动识别功能代码
  • 原文地址:https://www.cnblogs.com/pressforward/p/7094764.html
Copyright © 2020-2023  润新知