我一直在尝试了解新的 ASP.NET Core Identity 框架。
我希望能够允许客户使用外部提供商登录,这样我就不必担心密码存储。如果我使用默认提供程序:.AddDefaultIdentity<EntityUser>(),以及.AddAuthentication(with AddFacebook, AddGoogle, AddMicrosoftAccount),那就有效。
有些人拥有 Google 帐户和Facebook 帐户。我想允许用户登录他们的帐户,然后向同一用户添加其他提供商(只要电子邮件匹配)。
AspNetCore 的身份框架部分似乎严格控制一切。我知道如何覆盖视图,但不知道如何覆盖控制流。我如何将自己的逻辑融入其流程中以强制登录、注册?我还想在用户已经登录时将用户转发给外部提供商。
我需要的只是一个方向,他们已经将新的 AspNetCore 的关注点分开了,就像洋葱一样。这使得你很难知道你想要的东西在哪里。我什至不知道我不知道什么才能开始。
我有一个 WebAPI 应用程序,我正在使用第 3 方身份验证器(Firebase 身份验证)。
我的身份验证工作正常,但一旦用户登录到我的服务器,我想将凭据和用户数据保存到我的 ASP.NET Identity 表中。
如果我在 Startup.cs 文件中调用此行,我似乎可以使用 UserManager 创建帐户
services.AddIdentityCore<ApplicationUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
Run Code Online (Sandbox Code Playgroud)
这允许我在构造函数中添加 UserManager,而无需添加所有登录页面和默认的 cookie 身份验证方案(如果我调用 AddIdentity(),我通常会得到该方案)
但是,当我像这样在构造函数中添加 SignInManager 时
public ValuesController(SignInManager<ApplicationUser> signInManager)
Run Code Online (Sandbox Code Playgroud)
我似乎仍然收到此错误。
执行请求时发生未处理的异常。System.InvalidOperationException:尝试激活“testWebAPIFB.Controllers.ValuesController”时无法解析类型“Microsoft.AspNetCore.Identity.SignInManager`1[mvcWithAuth.Data.ApplicationUser]”的服务。
这似乎意味着 AddIdentityCore 不添加 SignInManager。如何将 SignInManager 添加为要依赖注入的类?
我在我的应用程序中使用 Asp.net core MVC,并实现了重置密码功能,并且工作正常。让我展示一下它是如何实现的。当用户请求重置密码时,应用程序会创建一个令牌,如下所示:
var token = _userManager.GeneratePasswordResetToken(user);
Run Code Online (Sandbox Code Playgroud)
该应用程序向用户发送一封电子邮件,当用户点击链接时,它会出现在用户重置密码的页面上。我正在重置如下:
ChangePasswordAsync(user, token, password);
Run Code Online (Sandbox Code Playgroud)
它运行良好。但我想在更改密码之前验证令牌是否有效。有什么办法可以做到吗?
我在 asp net core 3.1 应用程序中使用 Azure Cosmos DB 和 Microsoft.EntityFrameworkCore.Cosmos 包。在我的 OnModelCreating 方法的 AppContext 类中,我为每个 dbset ToContainer() 方法提供了定义容器的名称,否则它将为容器提供 AppContext 名称。一切正常,但它仍然在 CosmosDb 中创建一个容器 AppContext,我该如何解决这个问题?请帮忙。下面是我的代码。
应用上下文类
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace CosmosApp.Context
{
public class AppContext : IdentityDbContext<AppUser>
{
public DbSet<Teacher> Teachers { get; set; }
public DbSet<Student> Students { get; set; }
public AppContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToContainer("Users");
modelBuilder.Entity<AppUser>().ToContainer("Users");
modelBuilder.Entity<IdentityUserRole<string>>().ToContainer("UserRoles");
modelBuilder.Entity<IdentityUserLogin<string>>().ToContainer("UserLogins");
modelBuilder.Entity<IdentityUserClaim<string>>().ToContainer("UserClaims");
modelBuilder.Entity<IdentityRole>().ToContainer("Roles");
modelBuilder.Entity<IdentityUserToken<string>>().ToContainer("UserTokens");
modelBuilder.Entity<Teacher>().ToContainer("Teachers");
modelBuilder.Entity<Student>().ToContainer("Students");
modelBuilder.Entity<Teacher>().HasNoDiscriminator();
modelBuilder.Entity<Student>().HasNoDiscriminator();
} …Run Code Online (Sandbox Code Playgroud) c# asp.net-identity entity-framework-core asp.net-core azure-cosmosdb
任何人都可以帮助我推动我的托管 Blazor 应用程序(客户端、服务器和共享)在应用程序首次显示之前立即请求登录。我想要用户在访问应用程序之前必须登录的体验。
我的起点是具有 Api 授权(个人用户帐户)的 Blazor Webassemble(托管)模板
在用户请求具有该Authorize属性的特定操作/页面之前,在服务器端操作或客户端 Razor 页面上使用该属性不会启动身份验证流程。Authorize在第一次显示应用程序之前,我将如何开始授权流程?
我相信对于比我更精明的人来说这是可能的,甚至是微不足道的。有人可以给我一个正确的方向吗?
我试图将每个用户的角色包含在列表中,如下图所示。在 Index 方法中,我想将用户加入角色并将其发送到视图。但由于某种原因user.Roles没有被认可。所以看起来导航属性是缺乏的。我在下面添加了屏幕截图以更清楚地说明我的问题。我一直在遵循几个指南,它们似乎都使用起来user.Roles没有任何问题。
该代码对我来说似乎是正确的,我在这里缺少什么吗?
账户控制器
private AppIdentityDbContext context;
public AccountController(AppIdentityDbContext _context)
{
context = _context;
}
public IActionResult Index()
{
var usersWithRoles = (from user in context.Users
select new
{
Username = user.UserName,
Email = user.Email,
RoleNames = (from userRole in user.Roles
join role in context.Roles on userRole.RoleId
equals role.Id
select role.Name).ToList()
}).ToList().Select(p => new UsersViewModel()
{
Username = p.Username,
Email = p.Email,
Role = string.Join(",", p.RoleNames)
});
return View(usersWithRoles);
}
Run Code Online (Sandbox Code Playgroud)
用户视图模型
public class UsersViewModel
{ …Run Code Online (Sandbox Code Playgroud) 我想通过Claim内部访问我的电子邮件地址Identity
我尝试访问为:
var email = User.Identity.GetClaimsByType("emailaddress").ToString();
var email = User.Identity.GetClaimsByType("email").ToString();
var email = User.Identity.GetClaimsByType("Email").ToString();
Run Code Online (Sandbox Code Playgroud)
但这些都不起作用,它总是返回null,我怎样才能得到它?
索赔要求是:
{http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress: MyemailAdrress@mail.com}
Run Code Online (Sandbox Code Playgroud) 我有一个 .net cor 3.1 Blazor 服务器项目。我在这个项目中使用默认的身份系统。我想在不登录的情况下访问特定的剃须刀页面。我怎么做?任何想法?
我尝试添加@attribute [AllowAnonymous]到剃刀页面。但这对我不起作用
_Host.cshtml
page "/"
@using Microsoft.AspNetCore.Authorization
@namespace has.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@attribute [Authorize]
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>has</title>
<base href="~/" />
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link href="css/site.css" rel="stylesheet" />
<link href="css/custom_styles.css" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="_content/AntDesign/css/ant-design-blazor.css" rel="stylesheet" />
<link href="_content/Blazor.ContextMenu/blazorContextMenu.min.css" rel="stylesheet" />
<script src="_content/BlazorInputFile/inputfile.js"></script>
<script src="~/js/site.js"></script>
</head>
<body>
<app>
<component type="typeof(App)" …Run Code Online (Sandbox Code Playgroud) 我需要结合令牌和 cookie 来授权 wepapi 项目中的请求。我添加了 Cookie 和 Jwt 来验证请求。在更改 DefaultPolicy 之前,我可以获得我的声明(/信息),但更改后我得到 401。
这是我的 Program.cs 代码:
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme);
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.Authority = "https://localhost:7208/";
options.TokenValidationParameters.ValidateAudience = false;
options.TokenValidationParameters.ValidTypes = new[] { "at+jwt" };
});
var multiSchemePolicy = new AuthorizationPolicyBuilder(
CookieAuthenticationDefaults.AuthenticationScheme,
JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
builder.Services.AddAuthorization(o =>
{
o.DefaultPolicy = multiSchemePolicy;
});
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Run Code Online (Sandbox Code Playgroud)
和控制器代码:
namespace Whois.Api.Controllers
{
[ApiController] …Run Code Online (Sandbox Code Playgroud) 我正在学习 ASP.NET Core 中的身份验证/授权,并对在我的场景中应该使用哪些组件感到困惑:我有一个 SPA 前端和一个 ASP.NET Core API 后端。我正在使用仅支持授权代码流的第三方 OpenID Connect 提供商(如 Okta),因此我相信只有后端应该与该外部提供商通信。外部提供者仅处理身份验证,而不处理授权。我们的应用程序需要基于角色的访问控制。
c# asp.net-web-api asp.net-identity asp.net-core identityserver4