Я пытаюсь улучшить историю аутентификации для устаревшего приложения ASPNet MVC / OWIN - в настоящее время оно использует таблицы AspNetUsers / AspNetRoles / утверждений и т. Д. Вместе с формами + аутентификация на основе файлов cookie.
Я хочуиспользуйте Azure AD / OpenID Connect для аутентификации, но затем загрузите профиль / роли пользователя из базы данных, как в настоящий момент.По сути, больше нет управления паролями в приложении.Сами пользователи по-прежнему должны будут существовать / создаваться в приложении.
Приложение в значительной степени зависит от некоторых пользовательских данных, связанных с этими пользователями, поэтому использование ролей из Active Directory просто невозможно.
Аутентификация OpenID работает, однако я не уверен, как использовать существующую систему Identityuser / IdentityUserRole / RoleManager вместе с ней.
В основном, когда пользователь аутентифицируется с помощью Open ID, мы хотим загрузитьсоответствующего пользователя из базы данных (совпадающего по адресу электронной почты) и использующего этот профиль / роли пользователя в будущем.
В частности, атрибут AuthorizeAttribute (с указанными конкретными ролями) должен продолжать функционировать, как и раньше.
Это то, что я имею до сих пор:
public class IdentityConfig
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(AppIdentityDbContext.Create);
app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
app.CreatePerOwinContext<AppRoleManager>(AppRoleManager.Create);
ConfigureAuth(app);
}
/// <summary>
/// Configures OpenIDConnect Authentication & Adds Custom Application Authorization Logic on User Login.
/// </summary>
/// <param name="app">The application represented by a <see cref="IAppBuilder"/> object.</param>
private void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
//Configure OpenIDConnect, register callbacks for OpenIDConnect Notifications
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = ConfigHelper.ClientId,
Authority = String.Format(CultureInfo.InvariantCulture, ConfigHelper.AadInstance,
ConfigHelper.Tenant), // For Single-Tenant
PostLogoutRedirectUri = ConfigHelper.PostLogoutRedirectUri,
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
{
RoleClaimType = "roles",
},
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error/OtherError?errorDescription=" +
context.Exception.Message);
return Task.FromResult(0);
},
SecurityTokenValidated = async context =>
{
string userIdentityName = context.AuthenticationTicket.Identity.Name;
var userManager = context.OwinContext.GetUserManager<AppUserManager>();
var user = userManager.FindByEmail(userIdentityName);
if (user == null)
{
Log.Error("User {name} authenticated with open ID, but unable to find matching user in store", userIdentityName);
context.HandleResponse();
context.Response.Redirect("/Error/NoAccess?identity=" + userIdentityName);
return;
}
user.DateLastLogin = DateTime.Now;
IdentityResult result = await userManager.UpdateAsync(user);
if (result.Succeeded)
{
var authManager = context.OwinContext.Authentication;
ClaimsIdentity ident = await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ExternalBearer);
// Attach additional claims from DB user
authManager.User.AddIdentity(ident);
// authManager.SignOut();
// authManager.SignIn(new AuthenticationProperties { IsPersistent = false }, ident);
return;
}
throw new Exception(string.Format("Failed to update user {0} after log-in", userIdentityName));
}
}
});
}
}