提问人:Scott Ritshie 提问时间:9/17/2023 最后编辑:Scott Ritshie 更新时间:9/17/2023 访问量:22
.NET Framework 4.7 API v2 不会将来自 Blazor 服务器的调用视为已验证
.NET Framework 4.7 API v2 doesn't see call from Blazor server as authenticated
问:
我觉得我真的快要解决这个问题了,因为我必须连续 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.IsAuthenticated
response
GetUserName()
在应用程序 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 天,似乎找不到合适的代码混搭组合。任何例子将不胜感激!
答: 暂无答案
评论