.NET Framework 4.7 API v2 不会将来自 Blazor 服务器的调用视为已验证

.NET Framework 4.7 API v2 doesn't see call from Blazor server as authenticated

提问人:Scott Ritshie 提问时间:9/17/2023 最后编辑:Scott Ritshie 更新时间:9/17/2023 访问量:22

问:

我觉得我真的快要解决这个问题了,因为我必须连续 4 天不捣碎击键。:)

这是环境:

  • 旧版 .NET Framework 4.7(应用 1)具有登录窗体(下面的 Owin 包),其中包含用于查询用户和购物车数据的匿名 API 终结点。
  • Blazor 服务器 .NET 6.0(应用 2)托管一个新的结帐页面,该页面需要从应用 1 调用 API 并检索用户名/ID,这将用于获取购物车数据
  • 应用 1 用户状态终结点返回 401/未授权
  • 应用 1:Microsoft.Owin 3.0.1、Microsoft.AspNet.Identity.Owin 2.2.1
  • 应用程序 2:Microsoft.Owin.Security 4.2.2,Microsoft.Owin.Security.Cookies 4.2.2

下面是应用 1 公开的用户状态 API 终结点:

[AllowAnonymous, HttpGet, Route("api/account/status")]
[EnableCors("*", headers: "*", methods: "*")]
public HttpResponseMessage Status()
{            
    var response = this.Request.CreateResponse(this.User.Identity.IsAuthenticated ? HttpStatusCode.OK : HttpStatusCode.Unauthorized, this.User.Identity.GetUserName());
    return response;
}

但是,从来都不是真的,所以总是返回“未经授权”,并且它不会调用 .User.IsAuthenticatedresponseGetUserName()

在应用程序 2 中,我使用 IJSRuntime 调用 javascript fetch(),它调用上面的端点。 Index.razor:

protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            await GetUserNameAsync();
        }
    }

private static Task<AuthenticationState> GenerateEmptyAuthenticationState() => Task.FromResult(new AuthenticationState(new ClaimsPrincipal()));

    /// <summary>
    /// Calls site.js > returnUserNameAsync() that retrieves the UserName from an API call to TL.Web
    /// </summary>
    /// <returns></returns>
    private async Task<string> GetUserNameAsync()
    {
        return await JS.InvokeAsync<string>("returnUserNameAsync");
    }

在站点.js中:

window.returnUserNameAsync = () => {
    let userApiUrl = "http://localhost:55052/api/account/status";

    fetch(userApiUrl, {
        credentials: "same-origin"
    })
        .then(data => data.json())
        .then(data => console.log(data))
        .catch(err => console.log('Request failed:', err));
};

当应用程序 1 登录时,.设置 AspNet.ApplicationCookie。由于 Blazor js 调用是客户端调用,因此是否必须对 cookie 执行任何进一步操作才能进行身份验证?应用程序 1 还需要从应用程序 2 中获得什么?

我像土匪一样搜索了 4 天,似乎找不到合适的代码混搭组合。任何例子将不胜感激!

REST OIN BLAZOR-服务器端 表单身份验证 未经授权

评论


答: 暂无答案