1.Simple OAuth Server: Implementing a Simple OAuth Server with Katana OAuth Authorization Server Components
http://www.tugberkugurlu.com/archive/simple-oauth-server-implementing-a-simple-oauth-server-with-katana-oauth-authorization-server-components-part-1
public class MyOAuthAuthorizationServerProvider : OAuthAuthorizationServerProvider { public override async Task ValidateClientAuthentication( OAuthValidateClientAuthenticationContext context) { string clientId; string clientSecret; if (context.TryGetBasicCredentials(out clientId, out clientSecret)) { UserManager<IdentityUser> userManager = context.OwinContext.GetUserManager<UserManager<IdentityUser>>(); OAuthDbContext dbContext = context.OwinContext.Get<OAuthDbContext>(); try { Client client = await dbContext .Clients .FirstOrDefaultAsync(clientEntity => clientEntity.Id == clientId); if (client != null && userManager.PasswordHasher.VerifyHashedPassword( client.ClientSecretHash, clientSecret) == PasswordVerificationResult.Success) { // Client has been verified. context.OwinContext.Set<Client>("oauth:client", client); context.Validated(clientId); } else { // Client could not be validated. context.SetError("invalid_client", "Client credentials are invalid."); context.Rejected(); } } catch { // Could not get the client through the IClientManager implementation. context.SetError("server_error"); context.Rejected(); } } else { // The client credentials could not be retrieved. context.SetError( "invalid_client", "Client credentials could not be retrieved through the Authorization header."); context.Rejected(); } } public override async Task GrantResourceOwnerCredentials( OAuthGrantResourceOwnerCredentialsContext context) { Client client = context.OwinContext.Get<Client>("oauth:client"); if (client.AllowedGrant == OAuthGrant.ResourceOwner) { // Client flow matches the requested flow. Continue... UserManager<IdentityUser> userManager = context.OwinContext.GetUserManager<UserManager<IdentityUser>>(); IdentityUser user; try { user = await userManager.FindAsync(context.UserName, context.Password); } catch { // Could not retrieve the user. context.SetError("server_error"); context.Rejected(); // Return here so that we don't process further. Not ideal but needed to be done here. return; } if (user != null) { try { // User is found. Signal this by calling context.Validated ClaimsIdentity identity = await userManager.CreateIdentityAsync( user, DefaultAuthenticationTypes.ExternalBearer); context.Validated(identity); } catch { // The ClaimsIdentity could not be created by the UserManager. context.SetError("server_error"); context.Rejected(); } } else { // The resource owner credentials are invalid or resource owner does not exist. context.SetError( "access_denied", "The resource owner credentials are invalid or resource owner does not exist."); context.Rejected(); } } else { // Client is not allowed for the 'Resource Owner Password Credentials Grant'. context.SetError( "invalid_grant", "Client is not allowed for the 'Resource Owner Password Credentials Grant'"); context.Rejected(); } } }
2.Get IdentityDbContext during ValidateClientAuthentication in my custom OAuthAuthorizationServerProvider
http://stackoverflow.com/questions/24340088/owin-web-api-2-adding-additional-logic-to-bearer-authorization
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) { string clientId = string.Empty; string clientSecret = string.Empty; if (!context.TryGetBasicCredentials(out clientId, out clientSecret)) { context.SetError("invalid_client", "Client credentials could not be retrieved through the Authorization header."); context.Rejected(); return; } ApplicationDatabaseContext dbContext = context.OwinContext.Get<ApplicationDatabaseContext>(); ApplicationUserManager userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); if (dbContext == null) { context.SetError("server_error"); context.Rejected(); return; } try { AppClient client = await dbContext .Clients .FirstOrDefaultAsync(clientEntity => clientEntity.Id == clientId); if (client != null && userManager.PasswordHasher.VerifyHashedPassword(client.ClientSecretHash, clientSecret) == PasswordVerificationResult.Success) { // Client has been verified. context.OwinContext.Set<AppClient>("oauth:client", client); context.Validated(clientId); } else { // Client could not be validated. context.SetError("invalid_client", "Client credentials are invalid."); context.Rejected(); } } catch (Exception ex) { string errorMessage = ex.Message; context.SetError("server_error"); context.Rejected(); } }
上面代码有误:
Reject()与SetError()需注意顺序。
context.Rejected(); context.SetError("invalid_client", "The information provided are not valid !"); return;
Js请求与错误处理
$.ajax({ type: 'POST', url: '<myAuthorizationServer>', data: { username: 'John', password: 'Smith', grant_type: 'password' }, dataType: "json", contentType: 'application/x-www-form-urlencoded; charset=utf-8', xhrFields: { withCredentials: true }, headers: { 'Authorization': 'Basic ' + authorizationBasic }, error: function (req, status, error) { if (req.responseJSON && req.responseJSON.error_description) { var error = $.parseJSON(req.responseJSON.error_description); alert(error.message); } } });
阅读全文

公众号近期文章
赞赏支持
0 Responses to “OAuthAuthorizationServerProvider.ValidateClientAuthentication 验证代码示例”