几天来,我尝试申报 Blazor 应用程序的索赔。我终于找到了一种应该可行的方法,但由于某种原因,我无法在索赔列表中找到我的索赔。我创建了以下 AppClaimsPrincipalFactory:
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public AppClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
{
}
public override async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var id = await GenerateClaimsAsync(user);
if (user != null)
{
id.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName));
}
return new ClaimsPrincipal(id);
var principal = await base.CreateAsync(user);
if (!string.IsNullOrWhiteSpace(user.FirstName))
{
((ClaimsIdentity)principal.Identity).AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName));
}
if (!string.IsNullOrWhiteSpace(user.LastName))
{
((ClaimsIdentity)principal.Identity).AddClaim(new Claim(ClaimTypes.Surname, user.LastName));
}
return principal;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Startup.cs文件的ConfigureServices中添加了以下代码:
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
Run Code Online (Sandbox Code Playgroud)
有人可以帮我找出我的代码有什么问题吗?先感谢您。
更新
感谢布莱恩·帕克为我铺平了道路。为了使其在其他人需要时能够工作,我更改了 AppClaimsPrincipalFactory 类,如下所示:
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser> …Run Code Online (Sandbox Code Playgroud) asp.net-core blazor blazor-client-side asp.net-blazor blazor-webassembly
在我的项目中,我想记录数据库表中应用程序中发生的所有错误.我使用try catch块捕获几乎所有错误,但我无法捕获像4xx和5xx这样的全局错误.
有些情况下,应用程序不会重定向到Startup.cs的Configure方法中定义的异常处理程序,就像我键入不存在的URL时一样.
app.UseExceptionHandler("/Error");
Run Code Online (Sandbox Code Playgroud)
有没有办法捕获我的应用程序中发生的所有未处理的错误?
我创建了一个带有 razor 页面的 ASP.NET Core 2 项目,我想为访问者提供选择语言的机会。我遇到的第一个问题是更改 Web 应用程序 url,以便 ti 将包含当前的语言代码。我通过在ConfigureServices中添加以下代码解决了这个问题。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeFolder("/Account/Manage");
options.Conventions.AuthorizePage("/Account/Logout");
options.Conventions.AddFolderRouteModelConvention("/", model =>
{
foreach (var selector in model.Selectors)
{
var attributeRouteModel = selector.AttributeRouteModel;
attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{language=el-GR}", attributeRouteModel.Template);
}
});
});
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用以下 URL 访问页面:
http://domain/el-GR/MyPage
Run Code Online (Sandbox Code Playgroud)
我想做的最后一件事是改变每个请求的文化。我发现但我不喜欢的最佳解决方案是将以下代码放入我的页面中:
System.Globalization.CultureInfo.CurrentCulture = new System.Globalization.CultureInfo((string)RouteData.Values["language"]);
System.Globalization.CultureInfo.CurrentUICulture = new System.Globalization.CultureInfo((string)RouteData.Values["language"]);
Run Code Online (Sandbox Code Playgroud)
这不太好,因为我必须在项目中创建的每个剃刀页面中添加这些谎言。
是否有另一种方法可以为我的 Web 应用程序的所有请求设置区域性?
在asp.net core中,定义页面和文件夹的razor页面授权非常容易,如下所示:
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizePage("/Contact");
options.Conventions.AuthorizeFolder("/Private");
options.Conventions.AllowAnonymousToPage("/Private/PublicPage");
options.Conventions.AllowAnonymousToFolder("/Private/PublicPages");
});
Run Code Online (Sandbox Code Playgroud)
我的问题是我想在我的项目中使用角色,但我找不到一种方法来定义允许哪些角色查看页面内容。
我尝试使用 Authorize 属性,但它不适用于 Razor Pages。
AuthorizePage 可以采用第二个参数,该参数可用于定义将用于确定当前用户是否可以看到指定页面的策略。我使用它如下:
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Admin"));
});
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizePage("/Index", "RequireAdministratorRole");
});
Run Code Online (Sandbox Code Playgroud)
问题是它仍然不起作用。就好像我没有定义该策略一样。当我登录时,我可以看到该页面,当我未登录时,它会将我重定向到登录表单。
为了使其发挥作用,我还必须做其他事情吗?
我想通过使用 UseRewriter 中间件重写一个简单的 url。
var rewrite = new RewriteOptions()
.AddRedirect("Page1From", "Page1To") // Redirect
.AddRewrite("Page2From", "Page2To", true); // Rewrite
app.UseRewriter(rewrite);
Run Code Online (Sandbox Code Playgroud)
结果是,url“/Page1From”将被重定向到“Page1To”,而url“Page2From”将在没有重定向的情况下显示“/Page2To”的内容。
我想通过使用数据库中的数据来实现 AddRewrite 方法,但我只找到了如何使用自定义规则进行重定向。
var rewrite = new RewriteOptions()
.AddRedirect("Page1From", "Page1To") // Redirect
.AddRewrite("Page2From", "Page2To", true); // Rewrite
.Add(new MoviesRedirectRule( // Custom Rule
matchPaths: new[] { "/Page3From1", "/Page3From2", "/Page3From3" },
newPath: "/Page3To"));
app.UseRewriter(rewrite);
Run Code Online (Sandbox Code Playgroud)
规则如下:
public class MoviesRedirectRule : IRule
{
private readonly string[] matchPaths;
private readonly PathString newPath;
public MoviesRedirectRule(string[] matchPaths, string newPath)
{
this.matchPaths = matchPaths;
this.newPath = new PathString(newPath); …Run Code Online (Sandbox Code Playgroud) 我尝试创建一个 Razor 类库,我将能够在各种项目中使用它。我需要 Razor 类库来拥有它自己的实体框架实体。我想以某种方式设置解决方案,以便 Razor 类库将使用主 Web 应用程序的 dbcontext。我用谷歌搜索,但我没有找到实现它的方法。
我希望 Razor 类库是可重用的,这样我只需要在主 Web 应用程序中添加引用并添加迁移,一切就可以使用了。
有人可以建议我如何设置解决方案以使其工作吗?
asp.net-core-2.1 entity-framework-core-2.1 razor-class-library
我尝试创建一些Html Helpers,它将有一个开始标记和结束标记,其中包含其他内容,如Html.BeginForm.例如在Razor中我们可以使用Html.BeginForm帮助器,它具有以下语法:
@using (Html.BeginForm())
{
}
Run Code Online (Sandbox Code Playgroud)
此代码将包含a和中的大括号内容.我用内容解决打开和关闭标记的唯一方法是使用两个html助手.我定义了两个html助手:
public static MvcHtmlString StartForm(this System.Web.Mvc.HtmlHelper helper)
{
return new MvcHtmlString("<form>");
}
public static MvcHtmlString EndForm(this System.Web.Mvc.HtmlHelper helper)
{
return new MvcHtmlString("</form>");
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下示例使用帮助程序:
@Html.StartForm()
contents
@Html.EndForm()
Run Code Online (Sandbox Code Playgroud)
但我希望能够制作一个html助手,它在视图中具有以下格式:
@using (Html.MyForm())
{
<text>contents</text>
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题,因为我甚至不知道如何搜索它.
使用Entity Framework 6,我能够使用执行原始SQL查询并使用未在DBContext中定义的自定义模型来存储查询的输出.一个简单的例子如下:
List<MyModel> data = context.Database.SqlQuery<MyModel>("SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;").ToList();
Run Code Online (Sandbox Code Playgroud)
我执行一个SQL命令,我期待一个自定义模型列表.
我尝试用Entity Framework Core做类似的事情,我发现的最接近的例子将迫使我从DBContext定义一个属性.这将不允许我使用自定义模型来填充SQL服务器将返回的数据.
var books = context.Books.FromSql("SELECT * FROM Books").ToList();
Run Code Online (Sandbox Code Playgroud)
此查询通知实体框架核心该查询将返回书籍列表.有没有办法在Entity Framework Core中实现这样的东西?
我喜欢新的标签助手属性,这些属性使可读的动态html内容成为可能。我可以使用asp-controller和asp-action属性创建链接,如下所示:
<a asp-controller="Home" asp-action="Index">Index</a>
Run Code Online (Sandbox Code Playgroud)
问题是,在某些情况下,我只需要操作的URL即可在我的JavaScript中使用它。例如,为了在ASP.NET MVC 5中进行ajax调用,我可以使用以下代码:
$.ajax({
type: "POST",
url: '@Url.Action("GetData","Ajax")',
data: "{ }",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
}
});
Run Code Online (Sandbox Code Playgroud)
我试图在ASP.NET Core中找到一个等效的方法,但是找不到一个方法,因此必须自己创建URL。有没有一种方法可以在ASP.NET Core中获取“操作”和“剃刀页面” URL。