zoukankan      html  css  js  c++  java
  • 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);
                }
            });
    
    
        })
    

      





  • 相关阅读:
    hdu1238 Substrings
    CCF试题:高速公路(Targin)
    hdu 1269 迷宫城堡(Targin算法)
    hdu 1253 胜利大逃亡
    NYOJ 55 懒省事的小明
    HDU 1024 Max Sum Plus Plus
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1257 最少拦截系统
    HDU 1069 Monkey and Banana
    HDU 1104 Remainder
  • 原文地址:https://www.cnblogs.com/pressforward/p/7094764.html
Copyright © 2011-2022 走看看