update signutare
[CPE_learningsite] / CPE / CPE.App / CPE.App.Api / Providers / ApplicationOAuthProvider.cs
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 CPE.App.Api.Models;
13
14 namespace CPE.App.Api.Providers
15 {
16     public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
17     {
18         private readonly string _publicClientId;
19
20         public ApplicationOAuthProvider(string publicClientId)
21         {
22             if (publicClientId == null)
23             {
24                 throw new ArgumentNullException("publicClientId");
25             }
26
27             _publicClientId = publicClientId;
28         }
29
30         public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
31         {
32             var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
33
34             ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
35
36             if (user == null)
37             {
38                 context.SetError("invalid_grant", "The user name or password is incorrect.");
39                 return;
40             }
41
42             ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
43                OAuthDefaults.AuthenticationType);
44             ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
45                 CookieAuthenticationDefaults.AuthenticationType);
46
47             AuthenticationProperties properties = CreateProperties(user.UserName);
48             AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
49             context.Validated(ticket);
50             context.Request.Context.Authentication.SignIn(cookiesIdentity);
51         }
52
53         public override Task TokenEndpoint(OAuthTokenEndpointContext context)
54         {
55             foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
56             {
57                 context.AdditionalResponseParameters.Add(property.Key, property.Value);
58             }
59
60             return Task.FromResult<object>(null);
61         }
62
63         public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
64         {
65             // Resource owner password credentials does not provide a client ID.
66             if (context.ClientId == null)
67             {
68                 context.Validated();
69             }
70
71             return Task.FromResult<object>(null);
72         }
73
74         public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
75         {
76             if (context.ClientId == _publicClientId)
77             {
78                 Uri expectedRootUri = new Uri(context.Request.Uri, "/");
79
80                 if (expectedRootUri.AbsoluteUri == context.RedirectUri)
81                 {
82                     context.Validated();
83                 }
84             }
85
86             return Task.FromResult<object>(null);
87         }
88
89         public static AuthenticationProperties CreateProperties(string userName)
90         {
91             IDictionary<string, string> data = new Dictionary<string, string>
92             {
93                 { "userName", userName }
94             };
95             return new AuthenticationProperties(data);
96         }
97     }
98 }