2 using System.Collections.Generic;
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 CPE.App.Api.Models;
14 namespace CPE.App.Api.Providers
16 public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
18 private readonly string _publicClientId;
20 public ApplicationOAuthProvider(string publicClientId)
22 if (publicClientId == null)
24 throw new ArgumentNullException("publicClientId");
27 _publicClientId = publicClientId;
30 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
32 var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
34 ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
38 context.SetError("invalid_grant", "The user name or password is incorrect.");
42 ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
43 OAuthDefaults.AuthenticationType);
44 ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
45 CookieAuthenticationDefaults.AuthenticationType);
47 AuthenticationProperties properties = CreateProperties(user.UserName);
48 AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
49 context.Validated(ticket);
50 context.Request.Context.Authentication.SignIn(cookiesIdentity);
53 public override Task TokenEndpoint(OAuthTokenEndpointContext context)
55 foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
57 context.AdditionalResponseParameters.Add(property.Key, property.Value);
60 return Task.FromResult<object>(null);
63 public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
65 // Resource owner password credentials does not provide a client ID.
66 if (context.ClientId == null)
71 return Task.FromResult<object>(null);
74 public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
76 if (context.ClientId == _publicClientId)
78 Uri expectedRootUri = new Uri(context.Request.Uri, "/");
80 if (expectedRootUri.AbsoluteUri == context.RedirectUri)
86 return Task.FromResult<object>(null);
89 public static AuthenticationProperties CreateProperties(string userName)
91 IDictionary<string, string> data = new Dictionary<string, string>
93 { "userName", userName }
95 return new AuthenticationProperties(data);