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