我正在尝试在 .NET Core 3.0 ASP.NET Core API 服务中使用 Azure AD 实现 OpenID Connect。
它只是一个 API 服务,没有 UI,并且使用单独的 SPA 来访问 API 服务。
根据此处的说明,我从我的 SPA 发送登录请求,在身份验证后,该请求被重定向回/signin-oidc我的 API 上的端点。
此时,我收到一个错误:-
Error from RemoteAuthentication: "Unable to unprotect the message.State.".
Run Code Online (Sandbox Code Playgroud)
来自 SPA 的初始请求如下所示:-
tenantId = my Azure AD tenant ID
clientId = my Azure AD application ID
responseType = "id_token"
redirectUri = "http://localhost:12345/signin-oidc"
scope = "openid"
responseMode = "form_post"
state = "12345"
nonce = "67890"
https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize?client_id={clientId}&response_type={responseType}&redirect_uri={redirectUri}&scope={scope}&response_mode={responseMode}&state={state}&nonce={nonce}
Run Code Online (Sandbox Code Playgroud)
我的 API 启动代码如下所示:-
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureAD(o …Run Code Online (Sandbox Code Playgroud) 我在单独的类库中使用编译的Razor视图作为MVC3的一种插件系统.
我接着克里斯·范·德斯蒂德导向这里,只有主要偏离的部分有关添加引用,因为我装我的组装件在运行时.
因为我在运行时加载程序集,所以我没有在BoC库中使用VirtualPathProviderViewEngine,而是基于RazorViewEngine实现了我自己的ViewEngine.它的工作原理是在CreateView中重写viewPath以插入适当的命名空间,以便可以解析视图.
到目前为止一切都很好......我可以加载不同的模块,如果它们共享相同的名称,它们的控制器不会发生冲突.
我现在唯一的问题是,对于编译视图,不会调用_ViewStart._ViewStart适用于主机MVC3项目中的视图,但是对于从插件程序集加载的任何视图,它都找不到.
我有这样的路线设置: -
RouteTable.Routes.MapRoute(
string.Format("Plugin{0}Route", pluginName),
string.Format(@"Plugin/{0}/{{controller}}/{{action}}", pluginName),
new { },
new string[] { string.Format("{0}.Controllers", pluginName) });
Run Code Online (Sandbox Code Playgroud)
ViewEngine看起来像这样: -
public class PluginRazorViewEngine : RazorViewEngine
{
public PluginRazorViewEngine() : base()
{
ViewLocationFormats = new[]
{
"~/Plugin/%1/Views/{1}/{0}.cshtml",
"~/Plugin/%1/Views/{1}/{0}.vbhtml",
"~/Plugin/%1/Views/Shared/{0}.cshtml",
"~/Plugin/%1/Views/Shared/{0}.vbhtml",
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"
};
Run Code Online (Sandbox Code Playgroud)
(%1被替换为程序集的名称)
并且汇编在BoC库中注册如下: -
BoC.Web.Mvc.PrecompiledViews.ApplicationPartRegistry.Register(assembly, string.Format("/Plugin/{0}/", pluginName));
Run Code Online (Sandbox Code Playgroud)
从插件程序集加载视图时(在此示例中为"accounts"),查找并显示视图.但是它会在这些位置查找_ViewStart: -
~/plugin/accounts/views/invoice/_viewstart.cshtml
~/plugin/accounts/views/invoice/_viewstart.vbhtml
~/plugin/accounts/views/_viewstart.cshtml
~/plugin/accounts/views/_viewstart.vbhtml
~/plugin/accounts/_viewstart.cshtml
~/plugin/accounts/_viewstart.vbhtml
~/plugin/_viewstart.cshtml
~/plugin/_viewstart.vbhtml
~/_viewstart.cshtml
~/_viewstart.vbhtml
Run Code Online (Sandbox Code Playgroud)
但它没有查看文件所在的〜/ Views/Shared/_ViewStart.cshtml.
我试过改变我的ViewEngine中的所有位置格式(AreaMasterLocationFormats,AreaPartialViewLocationFormats,AreaViewLocationFormats,MasterLocationFormats,PartialViewLocationFormats和ViewLocationFormats),但它们似乎没有任何区别.
我环顾四周,似乎System.Web.WebPages.StartPage.GetStartPage负责查找并返回视图中的起始页面,但我找不到任何有关如何控制它的外观的信息.
我已经尝试将_ViewStart.cshtml移动到〜/ _ViewStart.cshtml(它看起来的地方之一)但是我马上得到: -
Unable to cast object …Run Code Online (Sandbox Code Playgroud)