华恒Mes鼎捷代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.3 KiB

5 months ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Claims;
  5. using System.Threading.Tasks;
  6. using Microsoft.AspNet.Identity;
  7. using Microsoft.AspNet.Identity.EntityFramework;
  8. using Microsoft.AspNet.Identity.Owin;
  9. using Microsoft.Owin.Security;
  10. using Microsoft.Owin.Security.Cookies;
  11. using Microsoft.Owin.Security.OAuth;
  12. using WebApplication1.Models;
  13. namespace WebApplication1.Providers
  14. {
  15. public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
  16. {
  17. private readonly string _publicClientId;
  18. public ApplicationOAuthProvider(string publicClientId)
  19. {
  20. if (publicClientId == null)
  21. {
  22. throw new ArgumentNullException("publicClientId");
  23. }
  24. _publicClientId = publicClientId;
  25. }
  26. public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
  27. {
  28. var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
  29. ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
  30. if (user == null)
  31. {
  32. context.SetError("invalid_grant", "用户名或密码不正确。");
  33. return;
  34. }
  35. ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
  36. OAuthDefaults.AuthenticationType);
  37. ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
  38. CookieAuthenticationDefaults.AuthenticationType);
  39. AuthenticationProperties properties = CreateProperties(user.UserName);
  40. AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
  41. context.Validated(ticket);
  42. context.Request.Context.Authentication.SignIn(cookiesIdentity);
  43. }
  44. public override Task TokenEndpoint(OAuthTokenEndpointContext context)
  45. {
  46. foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
  47. {
  48. context.AdditionalResponseParameters.Add(property.Key, property.Value);
  49. }
  50. return Task.FromResult<object>(null);
  51. }
  52. public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
  53. {
  54. // 资源所有者密码凭据未提供客户端 ID。
  55. if (context.ClientId == null)
  56. {
  57. context.Validated();
  58. }
  59. return Task.FromResult<object>(null);
  60. }
  61. public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
  62. {
  63. if (context.ClientId == _publicClientId)
  64. {
  65. Uri expectedRootUri = new Uri(context.Request.Uri, "/");
  66. if (expectedRootUri.AbsoluteUri == context.RedirectUri)
  67. {
  68. context.Validated();
  69. }
  70. }
  71. return Task.FromResult<object>(null);
  72. }
  73. public static AuthenticationProperties CreateProperties(string userName)
  74. {
  75. IDictionary<string, string> data = new Dictionary<string, string>
  76. {
  77. { "userName", userName }
  78. };
  79. return new AuthenticationProperties(data);
  80. }
  81. }
  82. }