我有一个 Blazer Server 应用程序,它现在使用来自本地 ADFS 服务器的身份验证。 确定用户后,我现在需要加载他们的权限。 我们认为这不能通过 ADFS 服务器的声明提供,因此希望在数据库中配置它,但需要了解如何/何时获取此信息。
关于与 ADFS 的钩子,我的代码如下(欢迎任何改进建议(
App.razor
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<h1>Sorry</h1>
<p>You're not authorized to reach this page.</p>
<p>You may need to log in as a different user.</p>
</NotAuthorized>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<h1>Sorry</h1>
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
应用设置。开发.json
{
"DetailedErrors": "true",
"ConnectionStrings": {
"MyDB": "Data Source=x.x.x.x;Initial Catalog=xxxxx;user id=me;password=sshhh;Persist Security Info=False;"
},
"Ida": {
"ADFSMetadata": "https://adfs.ourServer.com/FederationMetadata/2007-06/FederationMetadata.xml",
"Wtrealm": "https://localhost:44323/"
}
}
启动.cs(仅显示与安全相关的代码(
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.WsFederation;
public class Startup
{
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
.....
app.UseAuthentication();
app.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Frame-Options", "DENY");
var user = context.User;
if (user?.Identities.HasNoItems(identity => identity.IsAuthenticated) ?? true)
{
await context.ChallengeAsync(WsFederationDefaults.AuthenticationScheme).ConfigureAwait(false);
}
if (next != null)
{
await next().ConfigureAwait(false);
}
});
....
}
。
public void ConfigureServices(IServiceCollection services)
{
var wtrealm = this.Configuration.GetSection("Ida:Wtrealm").Value;
var metadataAddress = this.Configuration.GetSection("Ida:ADFSMetadata").Value;
services
.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
options.Wtrealm = wtrealm ;
options.MetadataAddress = metadataAddress;
options.UseTokenLifetime = false;
})
.AddCookie();
....
}
}
关于上述代码的任何建议? 当用户进入我们的网站(任何页面(时,他们会自动被推送到 ADFS 服务器进行身份验证。 似乎没问题,但阻止用户注销....
因此,从 ADFS 中,我们获得了几个标识用户的声明,例如他们的 UPNname。 我的想法是转到数据库并加载该用户拥有的所有角色/权限/权限。
- 我应该在我的代码中放置这样的代码
- 数据库当前由使用较旧"成员资格"表的另一个应用程序使用。 我想使用更新的东西,身份模型? 我不能冒险破坏其他应用程序的安全性。 我应该将安全性存储在新数据库中吗?
任何指示都将非常受欢迎...假设我是这方面的新手。
执行此操作的常用方法是为 ADFS 编写自定义属性提供程序。
然后,可以从数据库中获取所需的角色,并将其添加到声明中。
在阅读了很多关于这个领域的内容后,我发现了一个非常清晰的 PluralSight 课程,它为我解决了这个问题:
ASP.NET 酷睿 2 身份验证手册:克里斯·克鲁格
具体而言,请参阅以下章节:
执行声明转换
有关详细信息,请观看课程。 总结:
- 创建用于从数据库中提取数据的实体和上下文。 以正常方式在启动中注册这些内容。
- 创建一个配置文件服务(具有从 上下文(。 我还包含一个 MemoryCache 对象,以便我可以在本地 存储信息。
- 然后创建一个声明转换类(实现
IClaimsTransformation
(并将其注册为服务。 -
将这些内容添加到 Blazor 页的代码隐藏文件中,如下所示:
[注入] 受保护的 IClaimsTransformation ClaimsTransformation { get; set; } = null!;
[级联参数] 受保护的任务身份验证状态任务 { get; set; }
-
因此使用数据:
身份验证状态 authState = 等待此消息。AuthenticationStateTask;
ClaimsPrincipal user = authState.User;
声明主体 x = 等待此。ClaimsTransformation.TransformAsync(user(;