OAuth2 .net MVC實現獲取token


OAuth2 的原理這里不多講,可以看:https://www.cnblogs.com/icebutterfly/p/8066548.html

直奔主題:這里要實現的功能為,統計微軟的Owin程序集實現本地獲取token,完成token工作。

上代碼:

第一步:配置Startup.Auth.cs

    public partial class Startup
    {

        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/oauth2/token"),//設置獲取token地址
                Provider = new MyOAuthAuthorizationServerProvider(),//自定義token驗證
                AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(300)//定義token過期時間
            });

            //下面必須加用bearer方式
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
            {
            });
        }
    }

第二步:繼承OAuthAuthorizationServerProvider接口,重新里面的嚴重方法。我只實現通過用戶名密碼獲取token,所以只重寫兩個方法即可

public class MyOAuthAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {
        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            string clientId;
            string clientSecret;
            if (!context.TryGetBasicCredentials(out clientId, out clientSecret))
            {
                context.TryGetFormCredentials(out clientId, out clientSecret);
            }

            if (context.ClientId == null)
            {
                context.SetError("invalid_clientId", "client_Id is not set");
                return Task.FromResult<object>(null);
            }
            if (!string.IsNullOrEmpty(clientSecret))
            {
                context.OwinContext.Set("clientSecret", clientSecret);
            }
            var client = ClientRepository.Clients.Where(c => c.Id == clientId).FirstOrDefault();
            if (client != null)
            {
                context.Validated();
            }
            else
            {
                context.SetError("invalid_clientId", string.Format("Invalid client_id '{0}'", context.ClientId));
                return Task.FromResult<object>(null);
            }
            return Task.FromResult<object>(null);
        }

        public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            //這里寫驗證代碼
            if (context.UserName=="admin"&&context.Password=="123456")
            {
                var identity = new ClaimsIdentity(
                    new GenericIdentity(context.UserName,
                    OAuthDefaults.AuthenticationType),
                    context.Scope.Select(x => new Claim("urn:oauth:scope", x)));
                context.Validated(identity);
            }
            else
            {
                context.SetError("invalid_grant", "The user name or password is incorrect");
                return Task.FromResult<object>(null);
            }
            return Task.FromResult(0);
        }
    }

第三步:定義Client實體

    public class Client
    {
        public string Id { get; set; }
    }

    public class ClientRepository
    {
        public static List<Client> Clients = new List<Client>() {
            new Client{
                 Id = "test1"
            },
            new Client{
                 Id = "test2",
            }
        };
    }

第四步:編寫測試方法

    public class HomeController : Controller
    {

        [Authorize]//授權標簽
        public ActionResult Test()
        {
            //獲取到授權登陸用戶
            var authentication = HttpContext.GetOwinContext().Authentication;
            string name= authentication.User.Identity.Name;

            return Json(new { Message="Hello world",name= name });
        }

    }
View Code

 

OK,就這么簡單完成。

現在來測試:

第一步:獲取token,我用的POSTMan。成功獲取到token

 第二步:用postman測試也行,這里貼出用ajax請求的結果

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8" />
    <script src="Scripts/jquery-1.10.2.js"></script>
    <script>
        function ajax() {
            $.ajax({
                url: '/home/test',
                type: 'POST',
                contentType: 'application/x-www-form-urlencoded',
                headers: {
                    'Authorization': 'Bearer ' + $('#token').val(),
                },
                data: {},
                success: function (data) {
                    console.log(data);
                },
            })
        }
    </script>
</head>
<body>
    <input type="text" id="token" />
    <input type="button" value="提交" onclick="ajax()" />
</body>
</html>

測試結果為:

{
    "Message": "Hello world",
    "name": "admin"
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM