我一直在使用 blazor 和 .net 5.0。我遇到了一个简单但烦人的问题:我试图从 API 加载数据,但每次调用 Server blazor 都希望用户登录。
我明白,如果我们从 API 控制器中取出 [Authorize] 标签,而在 razor 页面中没有@attribute [Authorize],那就这样了。但我很难理解为什么我的 API 调用仍然需要protected override async Task OnInitializedAsync()错误消息中的 AccessToken,但没有说明原因。
Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenNotAvailableException: ''
at Microsoft.AspNetCore.Components.WebAssembly.Authentication.AuthorizationMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage request, HttpCompletionOption completionOption, Boolean async, Boolean emitTelemetryStartStop, CancellationToken cancellationToken)
Run Code Online (Sandbox Code Playgroud)
我还没接触过这个App。Web 程序集的 cs 文件..
任何人都可以帮忙吗?
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
@if (!context.User.Identity.IsAuthenticated)
{
<RedirectToLogin />
}
else
{
<p>You are not authorized to …Run Code Online (Sandbox Code Playgroud) forms-authentication asp.net-core blazor blazor-client-side blazor-webassembly
我有一个主要的asp.net应用程序,它是用asp.net 1.1编写的.在应用程序下面运行的是几个2.0应用程序.要完全注销用户,我可以使用FormsAuthentication.SignOut注销1.1应用程序,还是比这更复杂?
我在我的asp.net(3.5)应用程序中使用Forms身份验证.我还使用角色来定义用户可以访问应用程序的哪些子目录.因此,我的web.config文件的相关部分如下所示:
<system.web>
<authentication mode="Forms">
<forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies" />
</authentication>
<authorization >
<allow users="*"/>
</authorization>
</system.web>
<location path="Admin">
<system.web>
<authorization>
<allow roles="Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Run Code Online (Sandbox Code Playgroud)
根据我的阅读内容,这应确保能够访问Admin目录的唯一用户将是已经过身份验证并分配了Admin角色的用户.
用户身份验证,保存身份验证票证以及其他相关问题都可以正常工作.如果我从web.config文件中删除标签,一切正常.当我尝试强制执行只有具有Admin角色的用户应该能够访问Admin目录时,问题就出现了.
基于此MS KB文章以及提供相同信息的其他网页,我已将以下代码添加到我的Global.asax文件中:
protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
if (HttpContext.Current.User != null) {
if (Request.IsAuthenticated == true) {
// Debug#1
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
// In this case, ticket.UserData = "Admin"
string[] roles = new string[1] { ticket.UserData };
FormsIdentity id = new FormsIdentity(ticket);
Context.User …Run Code Online (Sandbox Code Playgroud) 当用户登录我的asp.net站点时,我使用以下代码:
FormsAuthentication.RedirectFromLoginPage(userid, false);
Run Code Online (Sandbox Code Playgroud)
因为我经常需要使用userid,然后我可以通过以下方式获取用户ID:
string userid = System.Web.HttpContext.Current.User.Identity.Name;
Run Code Online (Sandbox Code Playgroud)
现在我还想在每个页面上显示登录的用户名,因此我的问题是,如果我需要在每个页面上使用它,我最好放置用户名.User.Identity.Name已由userid使用,因此我无法使用该ID.另一个解决方案是在每个页面上从数据库中获取用户名,但这似乎是一个糟糕的解决方案.
那么:使用Sessions存储用户名的最佳方式是什么?
我正在使用的技术:
我正在为我的mvc应用程序使用状态服务器进程.在测试期间,当经过身份验证的用户单击"LogOff"按钮时,它将正确地将他们带到身份验证屏幕,并且在成功输入凭据后,会将其重新登录.但是,它会找到他们之前的会话变量状态,而不是重新加载我给他们的任何新权限.这是由于我在以下代码中加载用户的方式:
public override void OnAuthorization(AuthorizationContext filterContext) {
if (filterContext == null)
throw new ArgumentNullException("FilterContext");
if (AuthorizeCore(filterContext.HttpContext)) {
IUser customUser = filterContext.HttpContext.Session["CustomUser"] as IUser;
if ((customUser == null) || (customUser.Name != filterContext.HttpContext.User.Identity.Name)) {
customUser = new User(filterContext.HttpContext.User.Identity.Name,
filterContext.HttpContext.User.Identity.IsAuthenticated);
}
if (_privileges.Length > 0) {
if (!customUser.HasAtLeastOnePrivilege(_privileges))
filterContext.Result = new ViewResult { ViewName = "AccessDenied" };
}
filterContext.HttpContext.Session["CustomUser"] = customUser;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,你可以看到我正在存储我customUser的,Session并且该值是从前一个会话中获取的值,即使用户已经注销(但在滑动到期窗口内重新登录).
所以,我的问题是,我应该Session.Abandon()在我的LogOff方法中放一个简单的调用AccountController,还是有更清洁,更有利的方法来处理它?
不幸的是,我在网上找到的自定义角色和成员提供商背后的表单身份验证代码的所有示例都是用VB.NET代码编写的,我需要一个C#代码.请帮忙!!!!
我需要一个代码隐藏,它将执行以下操作:
Default.aspx代码:
<asp:Login ID="LoginUser" runat="server" EnableViewState="false" RenderOuterTable="false">
<LayoutTemplate>
<span class="failureNotification">
<asp:Literal ID="FailureText" runat="server"></asp:Literal>
</span>
<asp:ValidationSummary ID="LoginUserValidationSummary" runat="server" CssClass="failureNotification"
ValidationGroup="LoginUserValidationGroup"/>
<div class="accountInfo">
<fieldset class="login">
<legend>Account Information</legend>
<p>
<asp:Label ID="usernameLabel" runat="server" AssociatedControlID="username">Username:</asp:Label>
<asp:TextBox ID="username" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="username"
CssClass="failureNotification" ErrorMessage="User Name is required." ToolTip="User Name is required."
ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
</p>
<p>
<asp:Label ID="passwordLabel" runat="server" AssociatedControlID="password">Password:</asp:Label>
<asp:TextBox ID="password" runat="server" CssClass="passwordEntry" …Run Code Online (Sandbox Code Playgroud) c# asp.net forms-authentication roleprovider membership-provider
在aspx.net中,有什么区别
Context.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)
和
HttpContext.Current.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)
我目前正在使用Context.User.Identity.Name来自母版页的用户身份出现问题(用户A看到用户B数据).这可能是问题的根源吗?
假设我在web.config中使用这样的东西
<authentication mode="Forms">
<forms
loginUrl ="~/HomeLogin.aspx"
cookieless= "AutoDetect"
slidingExpiration="true"
timeout="10"
protection ="All"
/>
</authentication>
Run Code Online (Sandbox Code Playgroud)
如果slidingExpiration设置为true(默认值),则每次FormsAuthenticationModule对用户进行身份验证时,都会更新故障单的到期日期.如果设置为false,则不会在每个请求上更新到期日期,从而导致票证在首次创建故障单时过去完全超时.
注意: 存储在身份验证票证中的到期日期是绝对日期和时间值,如2008年8月2日上午11:34.此外,日期和时间是相对于Web服务器的本地时间.此设计决策可能会在夏令时(DST)周围产生一些有趣的副作用,即美国的时钟向前移动一小时(假设Web服务器托管在观察夏令时的区域).考虑一下在DST开始时(即凌晨2:00)附近有30分钟到期的ASP.NET网站会发生什么.想象一下,访客在2008年3月11日凌晨1点55分登录该网站.这将生成一张表单身份验证票证,该票证将于2008年3月11日凌晨2:25(将来30分钟)到期.但是,一旦凌晨2点左右,由于夏令时,时钟会跳到凌晨3点.当用户在登录后6分钟(上午3:01)加载新页面时,FormsAuthenticationModule会注意到故障单已过期并将用户重定向到登录页面.
这是一个可能导致问题的实例.任何人都可以指出这种方法的任何缺点.我有兴趣了解它.
谢谢
我正在尝试为MVC站点实现一个非常基本的Asp.net表单身份验证机制.我得到的问题是我的身份验证cookie设置为在一年后过期,而我不希望它在这么长时间后过期.这是我的一些代码:
web.config中
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
调节器
...
FormsAuthentication.SetAuthCookie(username, false);
...
Run Code Online (Sandbox Code Playgroud)
我找到了这个答案(这个问题类似,但在我的情况下,超时永远不会发生),但这是使cookie过期或我在这里做错了什么的唯一方法吗?
当我查看cookie时,它会在一年后过期,即使它会在几分钟后过期,为什么呢?
我想要的是某种程度上用户在一段时间后退出并且我认为在forms标签中设置过期会完成这项工作吗?
我创建了一个MVC 4,.Net 4.5网站,以便使用Forms身份验证,因此选择了该模板.然后更改了摘要,我需要交换使用Windows身份验证.这将推出到带有IIS8的Windows Server 2008盒子上.
我不能为我的生活转身关闭表格认证.通过NTLM成功通过身份验证后,MVC会尝试将我带到表单登录页面.我试过了:
<authentication mode="Windows" >AuthConfig.RegisterAuth();"和" FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);"Application_Start()HttpResponse.SuppressFormsAuthenticationRedirect在Application_EndRequest.这些都不起作用.唯一可怕的软糖(来自一个stackoverflow的帖子)是改变web.config中的下面 - 这有一些时髦的副作用(当应用程序不应该例如时,在导航时弹回Home):
<authentication mode="Windows" >
<!--<forms loginUrl="~/Account/Login" timeout="2880" />-->
<forms loginUrl="~/Home" timeout="2880" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
我觉得我错过了一些令人眼花缭乱的明显(可能是过滤器相关的)我需要做的更改,以禁用和从项目中删除表单auth.任何人都可以建议我需要采取永久删除的步骤吗?
iis forms-authentication windows-authentication asp.net-mvc-4
asp.net ×6
asp.net-mvc ×2
c# ×2
session ×2
.net ×1
asp.net-1.1 ×1
asp.net-core ×1
blazor ×1
iis ×1
login ×1
roleprovider ×1
roles ×1