This file was deleted.

This file was deleted.

@@ -1,13 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Courses.Buisness.Services
{
public interface IAuthenticationService
{
bool IsValid(string login, string password);
Courses.Models.User Find(int id);
Courses.Models.User Find(string username);
Courses.Models.User Find(string username, string password);
System.Security.Claims.ClaimsIdentity GetIdentity(Courses.Models.User user);
bool Register(string username, string password);
}
}
@@ -5,7 +5,8 @@
using System.Threading.Tasks;
using Courses.Buisness.Services;
using Courses.Models.Repositories;

using Courses.Models;
using System.Security.Claims;
namespace Courses.Buisness.Authentication
{
public class AuthenticationService : IAuthenticationService
@@ -18,15 +19,83 @@ public AuthenticationService(Models.Repositories.IAccountRepository repository)
throw new ArgumentNullException("Repository is null!");
this.repository = repository;
}
public User Find(int id)
{
if (id<=0)
{
throw new ArgumentException("userId");
}

public Boolean IsValid(string login, string password)
return repository.Get(id);
}
public User Find(string username)
{
var user = repository.GetUser(login, password);
if (user != null)
if(String.IsNullOrEmpty(username))
{
return true;
throw new ArgumentException("username");
}
return false;

return repository.GetUserByName(username);
}
public User Find(string username, string password)
{
if (String.IsNullOrEmpty(username))
{
throw new ArgumentException("username");
}
if (String.IsNullOrEmpty(password))
{
throw new ArgumentException("password");
}
var user = repository.GetUser(username, password);

return user;
}
public bool Register(string username,string password)
{
if (String.IsNullOrEmpty(username))
{
throw new ArgumentException("username");
}
if (String.IsNullOrEmpty(password))
{
throw new ArgumentException("password");
}
if(Find(username)!=null)
{
return false;
}
var user = new User()
{
Login = username,
Email = username,
PasswordHash = password,
CreatedDate = DateTime.Now,
UpdatedDate = DateTime.Now,
Role = Roles.Default.ToString()
};

repository.Add(user);
repository.SaveChanges();

return true;
}

public ClaimsIdentity GetIdentity(User user)
{
if(user==null)
{
throw new ArgumentNullException("user");
}
var claim = new ClaimsIdentity("ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
claim.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString(), ClaimValueTypes.String));
claim.AddClaim(new Claim(ClaimsIdentity.DefaultNameClaimType, user.Email, ClaimValueTypes.String));
claim.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider",
"OWIN Provider", ClaimValueTypes.String));
claim.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role, ClaimValueTypes.String));

return claim;
}

}
}
@@ -0,0 +1,44 @@
using System;
using System.Globalization;
using System.Security.Claims;
using System.Security.Principal;

namespace IdentityUoWApp.Models
{
public static class IdentityExtensions
{
public static T GetUserId<T>(this IIdentity identity) where T : IConvertible
{
if (identity == null)
{
throw new ArgumentNullException("identity");
}
var ci = identity as ClaimsIdentity;
if (ci != null)
{
var id = ci.FindFirst(ClaimTypes.NameIdentifier);
if (id != null)
{
return (T)Convert.ChangeType(id.Value, typeof(T), CultureInfo.InvariantCulture);
}
}
return default(T);
}
public static string GetUserRole(this IIdentity identity)
{
if (identity == null)
{
throw new ArgumentNullException("identity");
}
var ci = identity as ClaimsIdentity;
string role = "";
if (ci != null)
{
var id = ci.FindFirst(ClaimsIdentity.DefaultRoleClaimType);
if (id != null)
role = id.Value;
}
return role;
}
}
}
@@ -44,11 +44,12 @@
<ItemGroup>
<Compile Include="Account\AccountService.cs" />
<Compile Include="Authentication\AuthenticationService.cs" />
<Compile Include="Authentication\IdentityExtensions.cs" />
<Compile Include="Filtering\PartnerFilterFactory.cs" />
<Compile Include="Partner\PartnerService.cs" />
<Compile Include="Product\ProductService.cs" />
<Compile Include="Filtering\ProductFilterFactory.cs" />
<Compile Include="Authentication\AccountFilterFactory.cs" />
<Compile Include="Filtering\AccountFilterFactory.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
@@ -6,23 +6,7 @@

namespace Courses.Buisness.Filtering
{
/*
¨¨¨¨¨¨¨¨¨★
¨¨¨¨¨¨¨¨¨**
¨¨¨¨¨¨¨¨¨*o*
¨¨¨¨¨¨¨¨*♥*o*
¨¨¨¨¨¨¨***o***
¨¨¨¨¨¨**o**♥*o*
¨¨¨¨¨**♥**o**o**
¨¨¨¨**o**♥***♥*o*
¨¨¨*****♥*o**o****
¨¨**♥**o*****o**♥**
¨******o*****♥**o***
****o***♥**o***o***♥ *
¨¨¨¨¨____!_!____
¨¨¨¨¨\_________/¨¨
С НОВЫМ ГОДОМ, ДРУЗЬЯ!)
*/

public class AccountFilterFactory : IFilterFactory<Models.User>
{
public Func<Models.User, bool> GetFilterExpression(IEnumerable<FieldFilter> fieldFilters)
@@ -26,7 +26,7 @@ public static void RegisterBundles(BundleCollection bundles)
"~/Scripts/app/common.js",
"~/Scripts/app/app.datamodel.js",
"~/Scripts/app/app.viewmodel.js",
"~/Scripts/app/home.viewmodel.js",
//"~/Scripts/app/home.viewmodel.js",
"~/Scripts/app/_run.js"));

// Use the development version of Modernizr to develop with and learn from. Then, when you're
@@ -11,7 +11,7 @@
using Microsoft.Owin;
using Microsoft.Owin.Security;
using Courses.Gui.Client.Models;
using Courses.Gui.Client.Models.Identity;
//using Courses.Gui.Client.Models.Identity;

namespace Courses.Gui.Client
{
@@ -32,7 +32,10 @@ public Task SendAsync(IdentityMessage message)
return Task.FromResult(0);
}
}
public class UserModel:IdentityUser
{

}
// Configure the application user manager which is used in this application.
public class ApplicationUserManager : UserManager<UserModel>
{
@@ -44,48 +47,49 @@ public ApplicationUserManager(IUserStore<UserModel> store)
public static ApplicationUserManager Create(
IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
throw new NotImplementedException();
//var manager = new ApplicationUserManager(
// new CustomUserStore(context.Get<ApplicationDbContext>()));
var manager = new ApplicationUserManager(new Models.Identity.UserStore(context.Get<DAL.AccountRepository>()));
//var manager = new ApplicationUserManager(new UserStore(context.Get<DAL.AccountRepository>()));
// Configure validation logic for usernames
//manager.UserValidator = new UserValidator<UserModel, int>(manager)
//{
// AllowOnlyAlphanumericUserNames = false,
// RequireUniqueEmail = true
//};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
//manager.PasswordValidator = new PasswordValidator
//{
// RequiredLength = 6,
// RequireNonLetterOrDigit = false,
// RequireDigit = false,
// RequireLowercase = false,
// RequireUppercase = false,
//};
// Register two factor authentication providers. This application uses Phone
// and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug in here.
manager.RegisterTwoFactorProvider("PhoneCode",
new PhoneNumberTokenProvider<UserModel>
{
MessageFormat = "Your security code is: {0}"
});
manager.RegisterTwoFactorProvider("EmailCode",
new EmailTokenProvider<UserModel>
{
Subject = "Security Code",
BodyFormat = "Your security code is: {0}"
});
manager.EmailService = new EmailService();
manager.SmsService = new SmsService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<UserModel>(
dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
//manager.RegisterTwoFactorProvider("PhoneCode",
// new PhoneNumberTokenProvider<UserModel>
// {
// MessageFormat = "Your security code is: {0}"
// });
//manager.RegisterTwoFactorProvider("EmailCode",
// new EmailTokenProvider<UserModel>
// {
// Subject = "Security Code",
// BodyFormat = "Your security code is: {0}"
// });
//manager.EmailService = new EmailService();
//manager.SmsService = new SmsService();
//var dataProtectionProvider = options.DataProtectionProvider;
//if (dataProtectionProvider != null)
//{
// manager.UserTokenProvider =
// new DataProtectorTokenProvider<UserModel>(
// dataProtectionProvider.Create("ASP.NET Identity"));
//}
//return manager;
}
}

@@ -97,7 +101,8 @@ public class ApplicationSignInManager : SignInManager<UserModel,string>

public override Task<ClaimsIdentity> CreateUserIdentityAsync(UserModel user)
{
return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
throw new NotImplementedException();
// return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
}

public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)
@@ -13,17 +13,17 @@

namespace Courses.Gui.Client
{
public partial class Startup
public class Startup2
{
// Enable the application to use OAuthAuthorization. You can then secure your Web APIs
static Startup()
static Startup2()
{
PublicClientId = "web";
//PublicClientId = "web";

OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
AuthorizeEndpointPath = new PathString("/Account/Authorize"),
AuthorizeEndpointPath = new PathString("/Account/"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
@@ -56,9 +56,9 @@ public void ConfigureAuth(IAppBuilder app)
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, Models.Identity.UserModel>(
validateInterval: TimeSpan.FromMinutes(30),regenerateIdentity:(manager, user) =>
user.GenerateUserIdentityAsync(manager) )
//OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, Models.Identity.UserModel>(
//validateInterval: TimeSpan.FromMinutes(30),regenerateIdentity:(manager, user) =>
// user.GenerateUserIdentityAsync(manager) )
// getUserIdCallback: (id) => (id.GetUserId<int>().ToString()))
}
});
@@ -56,7 +56,7 @@ private void AddBindings()

kernel.Bind<IFilterFactory<Partner>>().To<PartnerFilterFactory>();

kernel.Bind<Microsoft.AspNet.Identity.IUserStore<Models.Identity.UserModel>>().To<Models.Identity.UserStore>();
kernel.Bind<IAuthenticationService>().To<Buisness.Authentication.AuthenticationService>();
}

public System.Web.Http.Controllers.IHttpController Create(HttpRequestMessage request, System.Web.Http.Controllers.HttpControllerDescriptor controllerDescriptor, Type controllerType)

Large diffs are not rendered by default.

@@ -5,7 +5,7 @@

namespace Courses.Gui.Client.Controllers
{
[Authorize]

public class HomeController : Controller
{
public ActionResult Index()
@@ -43,7 +43,7 @@ private set
// GET api/Me
public GetViewModel Get()
{
var user = UserManager.FindById(User.Identity.GetUserId<int>().ToString());
//var user = UserManager.FindById(User.Identity.GetUserId<int>().ToString());
return new GetViewModel() { Hometown = "Sevastopol"};
}
}
@@ -235,9 +235,6 @@
<Compile Include="Models\AccountViewModels.cs" />
<Compile Include="Models\IdentityModels.cs" />
<Compile Include="Models\IdentityUserStore.cs" />
<Compile Include="Models\Identity\UserModel.cs" />
<Compile Include="Models\Identity\UserRole.cs" />
<Compile Include="Models\Identity\UserStore.cs" />
<Compile Include="Models\ManageViewModels.cs" />
<Compile Include="Models\MeViewModels.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

This file was deleted.

This file was deleted.

This file was deleted.

@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Courses.Authorization;
//using Courses.Authorization;
using Courses.Models;
using Courses.Models.Repositories;
using Microsoft.AspNet.Identity;
@@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BrockAllen.MembershipReboot;
namespace Courses.Gui.Client.Models.MembershipReboot
{
public class UserAccount:BrockAllen.MembershipReboot.Relational.RelationalUserAccount
{
public new Guid ID
{
get
{
return base.ID;
}
set
{
base.ID = value;
}
}
public new string Username
{
get
{
return base.Username;
}
set
{
base.Username = value;
}
}
public new string Email
{
get
{
return base.Email;
}
set
{
base.Email = value;
}
}
public new string HashedPassword
{
get
{
return base.HashedPassword;
}
set
{
base.HashedPassword = value;
}
}
public new DateTime Created
{
get
{
return base.Created;
}
set
{
base.Created = value;
}
}
public new DateTime LastUpdated
{
get
{
return base.LastUpdated;
}
set
{
base.LastUpdated = value;
}
}
public new string Tenant
{
get
{
return base.Tenant;
}
set
{
base.Tenant = value;
}
}
}
}
@@ -0,0 +1,108 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BrockAllen.MembershipReboot;
using Courses.Models;
using Courses.Models.Repositories;
namespace Courses.Gui.Client.Models.MembershipReboot
{
public class UserAccountRepository:IUserAccountRepository
{
private readonly IAccountRepository _repository;

public UserAccountRepository(IAccountRepository repository)
{
if (repository != null)
_repository = repository;
else
throw new ArgumentNullException();
}

public UserAccount Convert(User item)
{
return new Models.MembershipReboot.UserAccount()
{
Created = item.CreatedDate,
LastUpdated = item.UpdatedDate,
ID = Guid.Parse(item.AuthKey),
Email = item.Email,
Username = item.Login,
Tenant = item.Role
};
}

public void Add(BrockAllen.MembershipReboot.UserAccount item)
{
var user = new User();
user.AuthKey = item.ID.ToString();
user.Email = item.Email;
user.CreatedDate = item.Created;
user.UpdatedDate = item.LastUpdated;
user.Login = item.Username;
user.PasswordHash = item.HashedPassword;

_repository.Add(user);
_repository.SaveChanges();
}

public BrockAllen.MembershipReboot.UserAccount Create()
{
return new Models.MembershipReboot.UserAccount()
{
Created = DateTime.Now,
LastUpdated = DateTime.Now
};
}

public BrockAllen.MembershipReboot.UserAccount GetByCertificate(string tenant, string thumbprint)
{
throw new NotImplementedException();
}

public BrockAllen.MembershipReboot.UserAccount GetByEmail(string tenant, string email)
{
throw new NotImplementedException();
}

public BrockAllen.MembershipReboot.UserAccount GetByID(Guid id)
{
return Convert(_repository.GetUserByAuthKey(id.ToString()));
}

public BrockAllen.MembershipReboot.UserAccount GetByLinkedAccount(string tenant, string provider, string id)
{
throw new NotImplementedException();
}

public BrockAllen.MembershipReboot.UserAccount GetByMobilePhone(string tenant, string phone)
{
throw new NotImplementedException();
}

public BrockAllen.MembershipReboot.UserAccount GetByUsername(string tenant, string username)
{
throw new NotImplementedException();
}

public BrockAllen.MembershipReboot.UserAccount GetByUsername(string username)
{
return Convert(_repository.GetUserByName(username));
}

public BrockAllen.MembershipReboot.UserAccount GetByVerificationKey(string key)
{
throw new NotImplementedException();
}

public void Remove(BrockAllen.MembershipReboot.UserAccount item)
{
throw new NotImplementedException();
}

public void Update(BrockAllen.MembershipReboot.UserAccount item)
{
throw new NotImplementedException();
}
}
}
@@ -0,0 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Courses.Gui.Client.Models.MembershipReboot
{

}
@@ -48,7 +48,8 @@
dataModel.setAccessToken(fragment.access_token);
} else {
// no token - so bounce to Authorize endpoint in AccountController to sign in or register
window.location = "/Account/Authorize?client_id=web&response_type=token&state=" + encodeURIComponent(window.location.hash);
// window.location = "/Account/Authorize?client_id=web&response_type=token&state=" + encodeURIComponent(window.location.hash);
// window.location = "/Account/Login"
}
}

@@ -2,17 +2,23 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;

[assembly: OwinStartup(typeof(Courses.Gui.Client.Startup))]

namespace Courses.Gui.Client
{
public partial class Startup
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
//ConfigureAuth(app);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login"),
});
}
}
}
@@ -30,10 +30,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Courses.Buisness.Services",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Courses.Gui.Manager", "Courses.Gui.Manager\Courses.Gui.Manager.csproj", "{8E366223-9B4F-41C0-9D2D-5CC04FEF0988}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{BACD6707-0CCE-467B-A457-603D3EAFACE5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Courses.Authorization", "Courses.Authorization\Courses.Authorization.csproj", "{0784039B-E8AD-4604-A209-3C0B05E2981E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Courses.Gui.Client", "Courses.Gui.Client\Courses.Gui.Client.csproj", "{0B978A13-514F-45DE-BED2-9BD93BD059DC}"
EndProject
Global
@@ -74,10 +70,6 @@ Global
{8E366223-9B4F-41C0-9D2D-5CC04FEF0988}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8E366223-9B4F-41C0-9D2D-5CC04FEF0988}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8E366223-9B4F-41C0-9D2D-5CC04FEF0988}.Release|Any CPU.Build.0 = Release|Any CPU
{0784039B-E8AD-4604-A209-3C0B05E2981E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0784039B-E8AD-4604-A209-3C0B05E2981E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0784039B-E8AD-4604-A209-3C0B05E2981E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0784039B-E8AD-4604-A209-3C0B05E2981E}.Release|Any CPU.Build.0 = Release|Any CPU
{0B978A13-514F-45DE-BED2-9BD93BD059DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0B978A13-514F-45DE-BED2-9BD93BD059DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0B978A13-514F-45DE-BED2-9BD93BD059DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -95,7 +87,6 @@ Global
{BE2EAC06-2EB3-4013-B85E-5E52EBAF42D1} = {1DB02EEE-E98A-4BF5-BD47-119FAAD13B23}
{7DDC3E7C-E381-4D21-BFAB-71D69626B9FB} = {1DB02EEE-E98A-4BF5-BD47-119FAAD13B23}
{8E366223-9B4F-41C0-9D2D-5CC04FEF0988} = {CA264FC3-6998-46A4-A848-9A33C92AA808}
{0784039B-E8AD-4604-A209-3C0B05E2981E} = {BACD6707-0CCE-467B-A457-603D3EAFACE5}
{0B978A13-514F-45DE-BED2-9BD93BD059DC} = {CA264FC3-6998-46A4-A848-9A33C92AA808}
EndGlobalSection
EndGlobal