GVKun编程网logo

ASP.Net MVC 的 Azure B2C 应用程序注册是否也可以与 Xamarin IOS 和 Android 应用程序一起使用

2

关于ASP.NetMVC的AzureB2C应用程序注册是否也可以与XamarinIOS和Android应用程序一起使用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ASP.NETCore

关于ASP.Net MVC 的 Azure B2C 应用程序注册是否也可以与 Xamarin IOS 和 Android 应用程序一起使用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门、ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 27. CICD Azure DevOps、ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动、ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

ASP.Net MVC 的 Azure B2C 应用程序注册是否也可以与 Xamarin IOS 和 Android 应用程序一起使用

ASP.Net MVC 的 Azure B2C 应用程序注册是否也可以与 Xamarin IOS 和 Android 应用程序一起使用

如何解决ASP.Net MVC 的 Azure B2C 应用程序注册是否也可以与 Xamarin IOS 和 Android 应用程序一起使用

我有一个网站,该网站目前已上线并使用 Azure B2C 来管理用户身份验证。该网站非常成功,以至于我决定使用 Xamarin 构建该网站的应用程序(IOS 和 Android)版本。

我的两个问题是:

  1. 我可以在 B2C 中使用我现有的应用程序注册来验证我的 MVC 和本机应用程序吗?如果是这样,这是通过 Azure B2C 中“身份验证”选项卡的“高级设置”部分下的“允许公共客户端流”单选按钮完成的吗?将其从“否”变为“是”是否会影响我的网站注册运行(因为该系统有数千名用户,我非常担心更新 B2C 设置。

  2. 测试 Azure B2C 更改的最佳方法是什么?有没有一种简单的方法可以创建开发环境,然后将其转换为实时版本,并使用开发环境切换实时版本?

我们将不胜感激。

J

解决方法

  1. 我可以使用 B2C 中现有的应用程序注册来验证我的 MVC 和本机应用程序吗?如果是这样,这是通过 高级设置下的允许公共客户端流单选按钮 Azure B2C 中的“身份验证”选项卡部分?将把这个从 No to Yes 会影响我注册网站的运行(如 该系统与数千名用户一起使用,我非常谨慎 B2C 设置的更新。

在这种情况下不建议使用相同的应用注册。

请参阅differences between public client and confidential client applications。

机密客户端应用程序可以安全地保留应用程序机密,而公共客户端则不然。如果您使用相同的应用程序注册,则在保留应用程序机密方面存在冲突。并且多个应用使用同一个应用注册会使得权限控制更加困难。

因此,在这种情况下,建议使用公共客户端/本机平台创建新的应用注册。

enter image description here

允许公共客户端流改为并不意味着将其更改为原生应用类型。

您可以在清单文件中设置 "allowPublicClient": true,

enter image description here

  1. 测试 Azure B2C 更改的最佳方法是什么?有没有一种简单的方法来创建可以翻转的开发环境, 使用开发环境切换实时版本?

创建新的应用注册不会影响您的网络应用的使用。

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

默认的身份认证好授权系统



UserManager用来操作用户的类,

Singi用来身份认证的

添加AccountController

先声明SignInManager和UserManager这两个服务

快捷键Ctrl+.

两个都需要分别进行Ctrl+.快速的生成

创建登陆的Action Login

建立View

创建LoginViewModel

主要是用户名和密码两个字段



登陆的逻辑

注册的逻辑



退出的逻辑

创建regiser的视图页面

在_Lauout里面添加了注册和登陆的链接


点击注册发现报错了。没有注册服务

注册服务

这里按照官方文档来就可以了

这里么有ApplicationDbContext


这里修改为IdentityContext

先进行数据迁移

报错,项目里面多余一个DbContext。一个是自己的DbConext 一个是Identity的DbContext

所以需要指定具体的DbContect


注册服务的时候,指明迁移的类库名称

再次尝试成功





上面只是配置了DbConext,还需要注册IdentityUser的服务


前面多加了一个叹号

密码严格要求了

参考官方文档:把这块复制过去进行修改



判断用户登陆成功后就不再显示,注册和登陆的按钮,在View页面注册ItentityUser





运行页面并不好用,没有使用中间件

登陆成功后

授权

添加一个学生,要求只有登陆的用户才可以进去添加
授权使用Authorize这个属性,这样就只有登陆的用户才可以访问这个Create页面

这个标签可以作用于Controller也可以作用于action,这里我们先作用于Create的两个Action就可以了

Authorize属性也可以加一些参数。。。、这里展示先不加
测试页面。

需要一个LoginPartial页面,一旦没有权限就会跳转到这个页面。这里我们先不做,

 

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 27. CICD Azure DevOps

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 27. CICD Azure DevOps

VSTS做持续集成


后来改名叫做Azure Deveps



https://azure.microsoft.com/zh-cn/services/devops/


这是中文的地址


创建一个项目

名称、描述、私有的项目

然后点击创建。对个人用户完全免费,个人团队不超过5个人都可以使用

相当于项目的首页

源码放在这里

复制git的地址

git init
然后把复制的两句话粘贴进去


这样源码 就上传上来了。

项目工行迁进来 看不出来啥效果。看一个已经存在的项目

找到一个文件之后,就可以看到文件的代码


修改的历史

点击历史可以对当前版本进行比较


开发管理



可以点开查看详情:



自定义查询,例如查询分配给我的工作


今天主要讲整理


可以做构建和发布

cl就是持续集成的意思

支持多种语言平台,除了.net core还支持java等





基本上都是默认的

可以输入关键字搜索模板,点击Apply


模板里面有这些步骤

有任何的代码提交到Mater后,就会开始自动构建




直接默认,然后点击Save即可

Releases










点击Add后就是这个效果


点击闪电的符号






选择订阅

然后再点击授权;








修改下本地的代码

代码提交一下  然后push

代码提交了就进行了一次build




状态变成对号了


在看Release,邮件也收到了。

点进去

点进去


看到失败了









更多的参考语雀:

https://www.yuque.com/yuejiangliu/dotnet/pu6igu


 

ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动

ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动

如何解决ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动

即使在 Visual Studio 中最简单的“Hello world”ASP.NET Core Web 应用程序上,我也遇到过此错误。 (Win 10 Pro、IIS Express、VS 2019 CE。)重现步骤:

  1. 在 Visual Studio 2019 中创建新的 ASP.NET Core 或 ASP.NET Core MVC 解决方案。选择选项以生成基本“hello world”应用程序的脚手架代码。无论您的目标是 .NET Core 2.1、.NET Core 3.1 还是 .NET 5.0,在我尝试的场景中结果都是一样的。

  2. 项目和解决方案已加载,源代码可见且看起来正确。按F5运行它。应用编译但不运行。

预期行为:“hello world”应用加载。

实际行为:在网络浏览器中显示此错误消息:

“HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动”(以及一些 故障排除步骤,然后)“有关更多信息,请访问: https://go.microsoft.com/fwlink/?LinkID=2028265”。

  1. 继续并点击该链接,然后使用这些资源仔细检查您是否拥有所有需要的包并且您的 IIS 配置正确。我的机器在我的机器上看起来很好,但我仍然收到这个错误。我什至尝试重新安装 VS、托管包、IIS 等,但无济于事。

注意:此问题与“500.32 ANCM Failed To 加载 DLL”或“500.36 ANCM 进程外处理程序加载失败” 错误,但我在故障排除过程中也遇到了这些错误,所以我 在这里提及它们,以防对其他人有帮助。

另请注意:您不一定有损坏的 ASP.NET Core 模块为 this documentation 会让您相信。

  1. 检查事件日志,您会发现其中存在一些错误,但在这种情况下,这些错误对诊断问题没有特别帮助。就我而言,它只是说

"应用程序 ''/LM/W3SVC/2/ROOT'' 具有物理根目录 ''H:\\Repo (R;)\\sandBox\\AspNetCoreWebApp001\\AspNetCoreWebApp001''加载失败 核心资源异常消息:CLR 工作线程提前退出"

"应用程序已从 Program.Main 退出,退出代码 = ''-2147450743''。请检查 stderr 日志以获取更多信息。"

他们将 IIS Express AspNetCore 模块显示为源。供应商文档在这种情况下并没有太大帮助。

  1. 仔细检查以确保 IIS 配置正确,并且安装了正确的包,包括 .NET Core 托管包。如果您不这样做,或者您正在尝试不同的配置,就像我在故障排除期间一样,那么您可能会看到上面提到的 ANCM 错误。如果您遇到这些错误,这里有 two links 可以提供帮助。我阅读了这些链接并多次仔细检查了我的机器。就我而言,这一切都是正确和完整的,但我仍然有错误。

  2. 再和电脑打几下,叫它一些坏名字,第三次重新安装Visual Studio,第八次验证IIS设置,向你的朋友寻求帮助,再次检查SO和Google。简单的 hello world 应用程序仍然无法运行,同样的错误。它在另一台机器上运行,所以代码本身没有任何问题。

解决方法

这是最终在我的机器上修复它的解决方案:我将解决方案移到了不同​​的文件夹。 HUH???如何我问,这能不能解决这个问题。经过一番折腾,我终于找到了根本原因:路径中有一个分号。是的。就我而言,我一直将解决方案存储在名为“H:\\Repo (R;)”的目录中。事实证明,即使 Windows 操作系统允许使用 ; 字符,.NET CLR 根本不喜欢它,也不知道如何处理它。因此它会生成无用的错误消息。

试试看。重命名“这应该可以工作”解决方案的文件夹以删除分号,关闭并重新打开 VS 中的解决方案,按 F5 并观察它运行。或者转到工作解决方案并将文件夹重命名为包含分号,然后观察它是否会破坏 CLR。​​

我很好奇文件夹名称中的任何其他特殊字符是否会导致问题,所以我检查了所有这些字符(在文件夹上,而不是文件名上,但我希望文件名也有类似的结果)。这是我的详尽测试:

Windows 不允许在文件夹名称中使用这些:

\\/:*?"<>|

当路径包含以下任何特殊字符时,解决方案将加载并运行:

`~-_+='',.()[]{}!@#$%&

但是,在 Windows 允许的路径中包含这些字符中的任何一个都会导致 CLR 或 Visual Studio 中的问题:

; 导致“HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动”

^ VS 无法加载解决方案并显示如下错误消息:

"在命令行中指定了以下文件:<.sln> 找不到这些文件,也不会加载这些文件。” 而是加载了一个完全空的 VS 实例。

我还尝试在 VS 中在名称中包含分号的文件夹下创建一个新的“hello world”控制台应用程序,你猜怎么着?这也无法运行。虽然在这种情况下,显然 IIS 没有 HTTP 错误。相反,它说

“未能创建 CoreCLR,HRESULT:0x80070057”

并抛出进程退出代码。再一次,这是路径中有分号的结果,因为从路径中删除该分号并在 VS 中重新加载解决方案可以使其正确运行。所以分号问题似乎源于CLR,因此与IIS无关。

以下是一些有关根本原因的相关帖子,这对于在 IIS Express 上运行的 Web 应用程序并不明显:

Failed to create CoreCLR,HRESULT: 0x80070057

https://github.com/dotnet/sdk/issues/13954

因此,感谢那些对 RCA 非常有帮助的帖子的作者。

有人会认为操作系统允许的特殊字符也可以用于 Visual Studio 代码的路径中。那好吧。吸取的教训。

ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

 

ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的.

MVC 路由注册通常是这样的:

RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 RouteCollection 类型的实例,而 RouteCollection 是一个继承自 Collection<RouteBase> 的子类, RouteBase 是 ASP.NET 路由系统定义的基类

.

RouteBase 有一个唯一的实现类:

当我们通过如下方法注册一个路由时:

 

实际是向全局路由表中添加了一个 Route 类型的实例,部分源码如下: 

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
    {
      ......
      Route route = new Route(url, (IRouteHandler) new MvcRouteHandler())
      {
    ......
      };
    ......
      routes.Add(name, (RouteBase) route);
      return route; }

从源码中我们可以看到,添加 Route 对象的时候,直接传入了一个 MvcRouteHandler 类型的实例.

我们知道, ASP.NET 的路由系统对路由的解析是通过一个注册的 HttpModule 对象实现对请求的拦截,然后为当前 Http 上下文动态映射一个 HttpHandler 对象, 而这个  HttpHandler 对象会接管对当前请求的处理并最终对请求予以响应.

这个注册的 HttpModule 对象的类型叫做 UrlRoutingModule .

我们可以在ASP.NET 的全局系统配置文件中找到它:

     <httpModules>
        ......
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule"/>
           ......
        </httpModules>

该类型在 PostResolveRequestCache 事件实现对请求的拦截:

 在拦截时,它做了这么几件事(部分源码省略):

public virtual void PostResolveRequestCache(HttpContextBase context)
    {
      RouteData routeData = this.RouteCollection.GetRouteData(context);     
      IRouteHandler routeHandler = routeData.RouteHandler; IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);  context.RemapHandler(httpHandler); }

1.遍历所有注册的路由,也就是所有添加到全局路由表中的 Route 类型的实例,通过调用它们的 GetRouteData 方法,拿到第一个匹配的 RouteData (路由数据);

2.拿到路由数据中的 RouteHandler 对象, 其实就是 MvcRouteHandler 类型的实例;

3.调用 MvcRouteHandler 的 GetHttpHandler 方法,拿到 HttpHandler.

MvcRouteHandler 的 GetHttpHandler 方法源码如下:

protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
      requestContext.HttpContext.SetSessionStateBehavior(this.GetSessionStateBehavior(requestContext));
      return (IHttpHandler) new MvcHandler(requestContext);
    }

可以看到,直接 new 了一个 MvcHandler 类型的实例,

最终,请求转交给这个 MvcHandler 类型的实例处理.

 

ASP.NET Web API 是怎么与 ASP.NET 路由系统接轨的呢?

我们知道, ASP.NET 的路由系统对路由的解析是通过一个注册的 HttpModule 对象实现对请求的拦截,然后为当前 Http 上下文动态映射一个 HttpHandler 对象, 而这个  HttpHandler 对象会接管对当前请求的处理并最终对请求予以响应.

这一条不仅对 MVC 适用, 对 Web API 同样适用,因为他俩都是借助于 ASP.NET 的路由系统.

区别在于 HttpHandler 的类型不一样而已.

ASP.NET Web API 注册路由的代码通常是这样的:

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new
                {
                    id = RouteParameter.Optional } );

config.Routes 是一个 HttpRouteCollection 类型的实例,并且是只读的.

只读的,就意味着只能在该实例所属的类的构造函数中初始化.

我们知道,这个 config 是 HttpConfiguration 类型,它在 GlobalConfiguration 类中初始化.

在它的初始化代码中,我们可以看到:

private static Lazy<HttpConfiguration> CreateConfiguration()
        {
            return new Lazy<HttpConfiguration>(() =>
            {
                HttpConfiguration config = new HttpConfiguration(new HostedHttpRouteCollection(RouteTable.Routes));
          ......return config;
            });
        }

 

HttpConfiguration 实际是对 HostedHttpRouteCollection 的封装,而后者是对 RouteTable.Route 的封装. 即 ASP.NET 全局路由表的封装.

所以说, HttpConfiguration 类型封装了 ASP.NET 的全局路由表. 它的 Routes 属性的实际类型是  HostedHttpRouteCollection

我们再回头看 config.Routes.MapHttpRoute 方法 , 也就是 HostedHttpRouteCollection 类型的 MapHttpRoute 方法:

public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler)
        {
            ......
            IHttpRoute route = routes.CreateRoute(routeTemplate, defaultsDictionary, constraintsDictionary, dataTokens: null, handler: handler);
            routes.Add(name, route);
            return route;
        }

很简单,创建了一个路由,然后添加它.

我们继续查看 HostedHttpRouteCollection 类型的 CreateRoute 方法:

public override IHttpRoute CreateRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
    {
    ......
    return (IHttpRoute) new HostedHttpRoute(uriTemplate, defaults, constraints, dataTokens, handler); }

返回了一个 HostedHttpRoute 类型的实例.

我们可以把这个方法 和 上面 MVC 的 MapRoute 方法做比较:

MVC:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
    {
      ......
      Route route = new Route(url, (IRouteHandler) new MvcRouteHandler())
      {
    ......
      };
    ......
      routes.Add(name, (RouteBase) route);
      return route;
    }

 

是不是非常像!不同的只是 MVC  new 的路由对象是 Route 类型,而 Web API new 的路由对象是 HostedHttpRoute 类型.

讲到这里,其实 ASP.NET Web API 的路由系统还没有和 ASP.NET 的路由系统衔接起来,它们二者的关系仅仅体现在下面这句话:

HttpConfiguration 实际是对 HostedHttpRouteCollection 的封装,而后者是对 RouteTable.Route 的封装. 即 ASP.NET 全局路由表的封装.

但是,当 HostedHttpRoute 创建后,调用 HostedHttpRouteCollection 的 Add 方法添加时,衔接就真正开始了:

public override void Add(string name, IHttpRoute route)
        {
            _routeCollection.Add(name, route.ToRoute());
        }
 

 _routeCollection 是 RouteCollection 类型,没看错,就是 ASP.NET 路由系统的 RouteCollection .

所以,这句代码实际是向 ASP.NET 路由系统的路由集合中添加路由,目的就是为了让 UrlRoutingModule 能够拦截到匹配了 Web API 注册的路由的请求.

但是,问题来了,从上面 MVC 的讲解中我们知道, ASP.NET 路由系统的 RouteCollection 是一个继承自 Collection<RouteBase> 的子类, RouteBase 是 ASP.NET 路由的基类,

而 HostedHttpRoute 是实现了 IHttpRoute 接口的实例, 

IHttpRoute  和 RouteBase 风马牛不相接啊!

所以,添加时,Web API 通过 HostedHttpRoute  的 ToRoute 方法,将自己转成了 RouteBase 类型!!

这个转化非常简单:

public static Route ToRoute(this IHttpRoute httpRoute)
        {
       ...... HostedHttpRoute hostedHttpRoute = httpRoute as HostedHttpRoute; if (hostedHttpRoute != null) { return hostedHttpRoute.OriginalRoute; }
       ...... }

问题又来了, HostedHttpRoute 类型的 OriginalRoute 是个什么鬼?当然,肯定是个 Route  类型,也就是说,它是一个 ASP.NET 路由系统定义的 Route 类型.那它是怎么来的呢?

我们知道,在 Web API 注册路由时, MapHttpRoute 内部创建了一个 HostedHttpRoute 类型的实例,并且是直接 new 的.

那么我们去看看 HostedHttpRoute 的构造函数:

public HostedHttpRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
        {
            ......
            OriginalRoute = new HttpWebRoute(uriTemplate, routeDefaults, routeConstraints, routeDataTokens, HttpControllerRouteHandler.Instance, this);
            ......
        }

OriginalRoute 原来是一个 HttpWebRoute 类型,而 HttpWebRoute 则是 ASP.NET 路由系统定义的 Route 类型的子类.

并且,创建 HttpWebRoute 类型的实例时,传入了一个 ASP.NET 路由系统定义的 IRouteHandler 类型的实例 : HttpControllerRouteHandler.Instance

而 HttpControllerRouteHandler 的 GetHttpHandler 方法如下:

/// <summary>
        /// Provides the object that processes the request.
        /// </summary>
        /// <param name="requestContext">An object that encapsulates information about the request.</param>
        /// <returns>
        /// An object that processes the request.
        /// </returns>
        protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new HttpControllerHandler(requestContext.RouteData);
        }

返回了一个 HttpControllerHandler 类型的实例.

HttpControllerHandler 类型的XML注释则非常清晰的解释了它的作用:

  /// 用于将 ASP.NET 请求传递给管道并写回结果。</summary>

这里说的管道,自然就是 Web API 的消息处理管道了.

 

总结:

ASP.NET MVC 和 ASP.NET Web API 都是通过 UrlRoutingModule ,在 PostResolveRequestCache 事件实现对请求的拦截.

拦截后,通过对HTTP上下文,路由等一系列处理后,

MVC 创建了 MvcHandler 进行具体的请求处理及响应;

Web API 创建了 HttpControllerHandler 进行具体的请求处理及响应.

原文出处:https://www.cnblogs.com/refuge/p/10505565.html

关于ASP.Net MVC 的 Azure B2C 应用程序注册是否也可以与 Xamarin IOS 和 Android 应用程序一起使用的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门、ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 27. CICD Azure DevOps、ASP.NET Core 或 ASP.NET Core MVC 解决方案无法运行,IIS Express 抛出 HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动、ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?等相关内容,可以在本站寻找。

本文标签: