标签: asp.net-identity

ASP.NET Core Identity:同一帐户的多个提供程序

我一直在尝试了解新的 ASP.NET Core Identity 框架。

我希望能够允许客户使用外部提供商登录,这样我就不必担心密码存储。如果我使用默认提供程序:.AddDefaultIdentity<EntityUser>(),以及.AddAuthentication(with AddFacebook, AddGoogle, AddMicrosoftAccount),那就有效。

有些人拥有 Google 帐户Facebook 帐户。我想允许用户登录他们的帐户,然后向同一用户添加其他提供商(只要电子邮件匹配)。

AspNetCore 的身份框架部分似乎严格控制一切。我知道如何覆盖视图,但不知道如何覆盖控制流。我如何将自己的逻辑融入其流程中以强制登录、注册?我还想在用户已经登录时将用户转发给外部提供商。

我需要的只是一个方向,他们已经将新的 AspNetCore 的关注点分开了,就像洋葱一样。这使得你很难知道你想要的东西在哪里。我什至不知道我不知道什么才能开始。

c# asp.net-identity asp.net-core

2
推荐指数
1
解决办法
1965
查看次数

如何依赖注入 SignInManager?

我有一个 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 添加为要依赖注入的类?

.net c# asp.net-identity asp.net-core asp.net-core-2.2

2
推荐指数
1
解决办法
1万
查看次数

在 Asp.Net Core MVC 中重置密码之前如何验证用户令牌是否有效?

我在我的应用程序中使用 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-mvc asp.net-identity asp.net-core

2
推荐指数
1
解决办法
3115
查看次数

Entity Framework Core 的 Cosmos 提供程序使用 DbContext 类名创建容器

我在 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

2
推荐指数
1
解决办法
3976
查看次数

Blazor 托管 - 在显示应用程序之前立即授权

任何人都可以帮助我推动我的托管 Blazor 应用程序(客户端、服务器和共享)在应用程序首次显示之前立即请求登录。我想要用户在访问应用程序之前必须登录的体验。

我的起点是具有 Api 授权(个人用户帐户)的 Blazor Webassemble(托管)模板

在用户请求具有该Authorize属性的特定操作/页面之前,在服务器端操作或客户端 Razor 页面上使用该属性不会启动身份验证流程。Authorize在第一次显示应用程序之前,我将如何开始授权流程?

我相信对于比我更精明的人来说这是可能的,甚至是微不足道的。有人可以给我一个正确的方向吗?

authentication asp.net-identity asp.net-core blazor

2
推荐指数
1
解决办法
2558
查看次数

如何显示具有角色的用户列表 - ASP.NET(核心)

我试图将每个用户的角色包含在列表中,如下图所示。在 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)

c# entity-framework asp.net-identity asp.net-core

2
推荐指数
1
解决办法
1万
查看次数

获取索赔电子邮件地址

我想通过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)

c# asp.net-web-api asp.net-identity

2
推荐指数
1
解决办法
2008
查看次数

Blazor 允许匿名访问 Razor 页面

我有一个 .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)

c# asp.net-identity asp.net-core blazor blazor-server-side

2
推荐指数
1
解决办法
6115
查看次数

当我在 ASP.NET 中组合 Bearer Token 和 Cookie 身份验证时,出现 401

我需要结合令牌和 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-authorization asp.net-identity asp.net-core-webapi

2
推荐指数
1
解决办法
1003
查看次数

使用外部 OpenID Connect 提供程序进行 ASP.NET Core 身份验证/授权

我正在学习 ASP.NET Core 中的身份验证/授权,并对在我的场景中应该使用哪些组件感到困惑:我有一个 SPA 前端和一个 ASP.NET Core API 后端。我正在使用仅支持授权代码流的第三方 OpenID Connect 提供商(如 Okta),因此我相信只有后端应该与该外部提供商通信。外部提供者仅处理身份验证,而不处理授权。我们的应用程序需要基于角色的访问控制。

  • 考虑到身份验证已由外部 OpenID Connect 提供商处理,我们是否需要 Identity Server?
  • 我们需要 ASP.NET Core Identity 吗?
  • 在这种情况下我们应该如何进行授权呢?

c# asp.net-web-api asp.net-identity asp.net-core identityserver4

2
推荐指数
1
解决办法
2614
查看次数