ASP.Net Core 5.0 认证授权
ASP.Net Core 5.0 Authentication and Authorization
我对 Blazor 很陌生,我想了解身份验证和授权。到目前为止,我所做的是阅读文档 Authentication and Authorization in ASP.NET Core Blazor and Rolebased Authorization in Asp.NET Core。我设法获得了身份验证 运行,但我正在努力获得授权。我想将访问我的服务器端应用程序的每个 windows 用户存储在数据库中,并说 User1 是管理员,User2 是编辑器等,并向用户显示页面的不同区域。
我能够读出 Windows 个用户,但直到现在我还不能设置角色。我用 claims
:
尝试过这样的事情
public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(new[]
{
new Claim( type: ClaimTypes.Name, value: @"User1")
}, "Editor");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
我把它附加到 ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddAuthorizationCore();
services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();
}
据我了解,此功能不适用于
<AuthorizeView Roles="Editor">
<p>Show User Identity: @context.User.Identity</p>
</AuthorizeView>
在 razor
页上,因为 Roles
根本不是 Claims
。但是我如何告诉我的应用程序 User1 的角色是“Editor”而 User2 的角色是“Admin”?还是有另一种方法来询问用户声明并向用户显示页面的不同区域?我错过了什么吗?
What I did so far is reading the docs Authentication and Authorization
in ASP.NET Core Blazor and Rolebased Authorization in Asp.NET Core. I
managed to get authentication running, but I am struggeling with
authorization. I would like to store every windows user who is
visiting my server side app in a database and say User1 is Admin,
User2 is Editor etc. and showing users diffrent areas of pages.
在官方文档(您正在阅读)中,基于角色的授权是通过 Asp.net Core Identity 实现的。您可以从 Add Role services to Identity.
中找到它
因此,您可以参考以下文章来配置您的应用程序以使用 Asp.net Core Identity。
Introduction to Identity on ASP.NET Core
Scaffold Identity in ASP.NET Core projects.
另外,从您的描述来看,您使用的是数据库来存储用户账号,看来您使用的是Individual User Accounts。您可以参考以下示例在 asp.net 核心 Blazor 应用程序中实现基于角色的授权。
创建一个 asp.net 核心 Blazor Server 应用程序并选择“个人用户帐户”类型并保持默认“在应用程序中存储用户帐户”以存储 SQL tables 在本地用于身份框架。
生成数据库和身份模式:
在包管理器控制台工具中使用以下命令。更多详细信息,查看EF Core Migrations.
add-migration InitialCreate
update-database
之后,使用SQL Server Management Studio(SSMS)查询数据库中的tables:
打开 Startup.cs 文件,使用以下更改修改“ConfigureServices”方法(添加 .AddRoles<IdentityRole>();
)。这样我们就可以在应用程序中控制身份角色的授权。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>();
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddSingleton<WeatherForecastService>();
}
运行申请,并注册两个用户:adminuser@hotmail.com
和normaluser@hotmail.com
.
然后,您可以从 dbo.AspNetUsers
table(通过 SSMS)中找到用户:
打开SSMS,右击dbo.AspNetRoles
table点击“查看数据”,添加两个角色(Id为Guid):
打开SSMS,右击dbo.AspNetUserRoles
table点击“查看数据”,将用户id和角色id复制到这个table中,为用户添加角色。
如果您不想使用此方法为特定用户添加角色,您可以使用UserManager.AddToRoleAsync() method to add the specified user to the named role. You could refer this article。
在页面文件夹中创建管理页面和普通页面。
AdminPage.razor:
@page "/adminpage"
@attribute [Authorize(Roles = "admin")]
<h3>AdminPage</h3>
@code {
}
NormalPage.Razor
@page "/adminpage"
@attribute [Authorize(Roles = "admin")]
<h3>AdminPage</h3>
@code {
}
使用以下更改修改共享组件“NavMenu”。
<AuthorizeView Roles="admin">
<li class="nav-item px-3">
<NavLink class="nav-link" href="adminpage">
<span class="oi oi-list-rich" aria-hidden="true"></span> Admin Page
</NavLink>
</li>
</AuthorizeView>
<AuthorizeView Roles="normal">
<li class="nav-item px-3">
<NavLink class="nav-link" href="normalpage">
<span class="oi oi-list-rich" aria-hidden="true"></span> Normal Page
</NavLink>
</li>
</AuthorizeView>
运行申请,结果是这样的:
参考:
Role Based Authorization In Blazor
我对 Blazor 很陌生,我想了解身份验证和授权。到目前为止,我所做的是阅读文档 Authentication and Authorization in ASP.NET Core Blazor and Rolebased Authorization in Asp.NET Core。我设法获得了身份验证 运行,但我正在努力获得授权。我想将访问我的服务器端应用程序的每个 windows 用户存储在数据库中,并说 User1 是管理员,User2 是编辑器等,并向用户显示页面的不同区域。
我能够读出 Windows 个用户,但直到现在我还不能设置角色。我用 claims
:
public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(new[]
{
new Claim( type: ClaimTypes.Name, value: @"User1")
}, "Editor");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
我把它附加到 ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddAuthorizationCore();
services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();
}
据我了解,此功能不适用于
<AuthorizeView Roles="Editor">
<p>Show User Identity: @context.User.Identity</p>
</AuthorizeView>
在 razor
页上,因为 Roles
根本不是 Claims
。但是我如何告诉我的应用程序 User1 的角色是“Editor”而 User2 的角色是“Admin”?还是有另一种方法来询问用户声明并向用户显示页面的不同区域?我错过了什么吗?
What I did so far is reading the docs Authentication and Authorization in ASP.NET Core Blazor and Rolebased Authorization in Asp.NET Core. I managed to get authentication running, but I am struggeling with authorization. I would like to store every windows user who is visiting my server side app in a database and say User1 is Admin, User2 is Editor etc. and showing users diffrent areas of pages.
在官方文档(您正在阅读)中,基于角色的授权是通过 Asp.net Core Identity 实现的。您可以从 Add Role services to Identity.
中找到它因此,您可以参考以下文章来配置您的应用程序以使用 Asp.net Core Identity。
Introduction to Identity on ASP.NET Core
Scaffold Identity in ASP.NET Core projects.
另外,从您的描述来看,您使用的是数据库来存储用户账号,看来您使用的是Individual User Accounts。您可以参考以下示例在 asp.net 核心 Blazor 应用程序中实现基于角色的授权。
创建一个 asp.net 核心 Blazor Server 应用程序并选择“个人用户帐户”类型并保持默认“在应用程序中存储用户帐户”以存储 SQL tables 在本地用于身份框架。
生成数据库和身份模式:
在包管理器控制台工具中使用以下命令。更多详细信息,查看EF Core Migrations.
add-migration InitialCreate update-database
之后,使用SQL Server Management Studio(SSMS)查询数据库中的tables:
打开 Startup.cs 文件,使用以下更改修改“ConfigureServices”方法(添加
.AddRoles<IdentityRole>();
)。这样我们就可以在应用程序中控制身份角色的授权。public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddRazorPages(); services.AddServerSideBlazor(); services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>(); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddSingleton<WeatherForecastService>(); }
运行申请,并注册两个用户:
adminuser@hotmail.com
和normaluser@hotmail.com
.然后,您可以从
dbo.AspNetUsers
table(通过 SSMS)中找到用户:打开SSMS,右击
dbo.AspNetRoles
table点击“查看数据”,添加两个角色(Id为Guid):打开SSMS,右击
dbo.AspNetUserRoles
table点击“查看数据”,将用户id和角色id复制到这个table中,为用户添加角色。如果您不想使用此方法为特定用户添加角色,您可以使用UserManager.AddToRoleAsync() method to add the specified user to the named role. You could refer this article。
在页面文件夹中创建管理页面和普通页面。
AdminPage.razor:
@page "/adminpage" @attribute [Authorize(Roles = "admin")] <h3>AdminPage</h3> @code { }
NormalPage.Razor
@page "/adminpage" @attribute [Authorize(Roles = "admin")] <h3>AdminPage</h3> @code { }
使用以下更改修改共享组件“NavMenu”。
<AuthorizeView Roles="admin"> <li class="nav-item px-3"> <NavLink class="nav-link" href="adminpage"> <span class="oi oi-list-rich" aria-hidden="true"></span> Admin Page </NavLink> </li> </AuthorizeView> <AuthorizeView Roles="normal"> <li class="nav-item px-3"> <NavLink class="nav-link" href="normalpage"> <span class="oi oi-list-rich" aria-hidden="true"></span> Normal Page </NavLink> </li> </AuthorizeView>
运行申请,结果是这样的:
参考:
Role Based Authorization In Blazor