gpt4 book ai didi

asp.net - Windows 身份验证适用于 IIS,但不适用于 Kestrel/Microsoft.AspNetCore.Authentication.Negotiate(不在 Chrome 中,有时在 Edge 中,始终在 IE 中)?

转载 作者:行者123 更新时间:2023-12-01 03:04:28 37 4
gpt4 key购买 nike

我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Razor 组件 ( ...\BlazorApp1\BlazorApp1\Shared\LoginDisplay.razor )。

<AuthorizeView>
Hello, @context.User.Identity.Name!
</AuthorizeView>

如果使用 Kestrel 运行,则不会显示该消息。所以我尝试了以下 steps 使其在 Kestrel 中工作。
  • 导入 NuGet 包 Microsoft.AspNetCore.Authentication.Negotiate
  • ConfigureService()中添加以下代码在 Startup.cs .
  •     services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
  • Configure()中添加以下代码在 Startup.cs .它们添加在 app.UseRouting(); 之间和 app.UseEndpoints(... ;
  •             app.UseAuthentication();
    app.UseAuthorization();

    它仍然不显示 Hello 消息。我读到“允许匿名请求。使用 ASP.NET Core 授权来挑战匿名身份验证请求。”在 document ,所以我做了以下操作来禁用匿名请求。

    _Host.cshtml , 在 @namespace BlazorApp1.Pages 之后添加以下几行.
    @using Microsoft.AspNetCore.Authorization
    @attribute [Authorize]

    但是,消息还是不显示?这是否意味着授权不起作用?

    更新:

    我更新了文件 ...\BlazorApp1\BlazorApp1\Shared\LoginDisplay.razor
    <AuthorizeView>
    <Authorized>
    Hello, @context.User.Identity.Name!
    </Authorized>
    <NotAuthorized>
    You are not authorized to view that page...
    </NotAuthorized>
    </AuthorizeView>

    它显示“您无权查看该页面...”。似乎 Windows 身份验证不起作用?

    更新2:

    文档中提到了以下内容。

    Windows environment configuration The Microsoft.AspNetCore.Authentication.Negotiate component performs User Mode authentication. Service Principal Names (SPNs) must be added to the user account running the service, not the machine account. Execute setspn -S HTTP/mysrevername.mydomain.com myuser in an administrative command shell.



    我尝试在家里的个人电脑上的管理员 powershell 控制台中运行以下命令。
    setspn -S HTTP/mypcname myusername

    然而,它得到了错误
    PS C:\WINDOWS\system32> setspn -S HTTP/desktop8930 nkucw
    Ldap Error(0x51 -- Server Down): ldap_connect
    Failed to retrieve DN for domain "" : 0x00000051
    Warning: No valid targets specified, reverting to current domain.
    FindDomainForAccount: Call to DsGetDcNameWithAccountW failed with return value 0x0000054B
    Unable to locate account nkucw

    这是输出:( 它在日志中显示“授权成功。”几次 ,但最后一次显示授权失败)

    信息:Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
    用户资料可用。使用“C:\Users\nkucw\AppData\Local\ASP.NET\DataProtection-Keys”作为 key 存储库和 Windows DPAPI 来加密静态 key 。
    信息:Microsoft.Hosting.Lifetime[0]
    现在收听:https://localhost:5001
    信息:Microsoft.Hosting.Lifetime[0]
    现在监听:http://localhost:5000
    信息:Microsoft.Hosting.Lifetime[0]
    应用程序启动。按 Ctrl+C 关闭。
    信息:Microsoft.Hosting.Lifetime[0]
    托管环境:开发
    信息:Microsoft.Hosting.Lifetime[0]
    内容根路径:C:\Users\nkucw**strong text**\source\repos\TestPS\BlazorApp1
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求启动 HTTP/1.1 GET https://localhost:5001/
    信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
    授权失败。
    信息:Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler[12]
    AuthenticationScheme:协商受到质询。
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 135.0172ms 401 内完成
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求启动 HTTP/1.1 GET https://localhost:5001/
    信息:Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler[0]
    没有任何
    信息:Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler[1]
    不完整的协商握手,发送额外的 401 协商挑战。
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 16.6473ms 401 内完成
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求启动 HTTP/1.1 GET https://localhost:5001/
    信息:Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler[0]
    没有任何
    信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
    授权成功。
    信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
    执行端点'/_Host'
    信息:Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[3]
    路由与 {page = "/_Host"} 匹配。执行页面/_Host
    信息:Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[103]
    执行隐式处理程序方法 - ModelState 有效
    信息:Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[104]
    执行隐式处理程序方法,返回结果 Microsoft.AspNetCore.Mvc.RazorPages.PageResult。
    信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
    授权成功。
    信息:Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[4]
    在 206.51090000000002ms 内执行页面/_Host
    信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
    执行端点'/_Host'
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 270.6847ms 200 text/html 内完成;字符集=utf-8
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求启动 HTTP/1.1 GET https://localhost:5001/css/bootstrap/bootstrap.min.css
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求开始 HTTP/1.1 GET https://localhost:5001/css/site.css
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求启动 HTTP/1.1 GET https://localhost:5001/_framework/blazor.server.js
    信息:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[6]
    文件/css/site.css 未被修改
    信息:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[6]
    文件/_framework/blazor.server.js 未修改
    信息:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[6]
    文件/css/bootstrap/bootstrap.min.css 未被修改
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 26.105700000000002ms 304 text/css 内完成
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 21.6629ms 304 application/javascript 内完成
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 21.6629ms 304 text/css 内完成
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求开始 HTTP/1.1 GET https://localhost:5001/css/open-iconic/font/css/open-iconic-bootstrap.min.css
    信息:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[6]
    文件/css/open-iconic/font/css/open-iconic-bootstrap.min.css 未修改
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 7.1119ms 内完成 304 text/css
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求开始 HTTP/1.1 POST https://localhost:5001/_blazor/negotiate text/plain;charset=UTF-8 0
    信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
    执行端点'/_blazor/negotiate'
    信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
    执行端点'/_blazor/negotiate'
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 22.780900000000003ms 200 application/json 内完成
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求开始 HTTP/1.1 GET https://localhost:5001/css/open-iconic/font/fonts/open-iconic.woff
    信息:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[6]
    文件/css/open-iconic/font/fonts/open-iconic.woff 没有被修改
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
    请求开始 HTTP/1.1 GET https://localhost:5001/_blazor?id=ase9fodeUXavBCDTwk1Suw
    信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
    请求在 7.676900000000001ms 304 application/font-woff 内完成
    信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
    执行端点'/_blazor'
    信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
    授权失败。


    更新3:

    发现它在 Edge 中有效,但在 Chrome 中无效。是服务器端 Blazor 的错误吗?

    更新4:

    即使使用Edge,不断刷新页面表明它有时可能无法获得身份验证。

    最佳答案

    我在处理类似问题时发现了您的问题 issue .我想我知道您的问题的答案 - 您可以使用一个简单的中间件来挑战身份验证并显示登录信息。

  • 将此添加到您的配置方法中:
  • app.UseMiddleware<ValidateAuthentication>();
  • 这是中间件本身:
  • internal class ValidateAuthentication : IMiddleware
    {
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
    if (context.User.Identity.IsAuthenticated)
    await next(context);
    else
    await context.ChallengeAsync();
    }
    }
  • 在 ConfigureServices 中:
  •  services.AddSingleton<ValidateAuthentication>();

    您不应该需要构造函数。

    关于asp.net - Windows 身份验证适用于 IIS,但不适用于 Kestrel/Microsoft.AspNetCore.Authentication.Negotiate(不在 Chrome 中,有时在 Edge 中,始终在 IE 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59111331/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com