当前位置: 澳门新濠3559 > 编程 > 正文

识别用户是否关注公众号,身份认证过程分为两

时间:2019-12-08 22:39来源:编程
一、功能 SpeechRecognition简介 iOS10中的公开的新API : SpeechRecognition 可以用于识别用户的语音,我们可以根据识别结果来实现一些我们想要的操作。 网上搜罗了下相关资料不多,本人参考

一、功能

SpeechRecognition简介

iOS10中的公开的新API :Speech Recognition可以用于识别用户的语音,我们可以根据识别结果来实现一些我们想要的操作。
网上搜罗了下相关资料不多,本人参考了一些国外的网站,自己写了个DEMO,在这做个简单分享:

ASP.NET身份认证过程

在ASP.NET中,身份认证过程分为两个部分:

  1. 认证:识别当前请求的用户是否为可识别(已登录)用户;
  2. 授权:根据认证中识别的用户决定是否允许当前用户的请求访问指定的资源。

其中Forms认证由FormsAuthenticationModule实现,URL授权检查由UrlAuthorizationModule实现

识别用户是否关注公众号,没有关注则弹出二维码让用户关注

功能授权

现在iOS10对系统功能的使用都需要进行一次用户授权,所以我们就像设置相机一样,在info.plist文件中也要添加相关的使用描述,语音识别功能需要用到两个系统功能:
NSSpeechRecognitionUsageDescription: 语音识别使用描述
NSMicrophoneUsageDescription:麦克风使用描述
所以我们添加:

<key>NSSpeechRecognitionUsageDescription</key> 
<string>Speech Recognition</string> 
<key>NSMicrophoneUsageDescription</key> 
<string>Microphone</string> 

这里的string即描述会在提示用户的时候显示。

图:

澳门新濠3559 1

Paste_Image.png

认证(登录与登出的实现)

//登录
public static bool SignOn(string username,string password,bool persist)
{
    InterfaceUserService userService = null;
    if (userService == null)
    {
        userService = new UserService();
    }
    //此处省略参数合法性验证   

    //验证用户名密码是否正确,若正确则设置Cookie
    if (userService.Validate(username, password))
    {
        SetAuthenticationTicket(username, persist);
        HttpCookie authCookie = FormsAuthentication.GetAuthCookie(username,persist);
        HttpContext.Current.Response.Cookies.Remove(authCookie.Name);
        HttpContext.Current.Response.Cookies.Add(authCookie);
        return true;
    }
    else
    {
        return false;
    }
}

//登出
public static void LogOut()
{
    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName);
    //使cookie强制过期
    authCookie.Expires = DateTime.Now.AddYears(-30);
    authCookie.Path = HttpContext.Current.Request.ApplicationPath;

    HttpContext.Current.Response.Cookies.Add(authCookie);
    //退出登录后执行页面重定向到主页操作
}

//获取登录用户名部分代码,AuthenticationMoudel类中的UserName属性
public string UserName
{
    get
    {
        var httpContext = HttpContext.Current;
        if (httpContext != null &&
            httpContext.Request != null &&
            httpContext.Request.IsAuthenticated)
        {
            try
            {
                return httpContext.User.Identity.Name;
            }
            catch
            {

            }
        }
        else
        {
            return null;    
        }
    }
}

对于Forms认证,我们需要在Web.config的<system.web>节点部分添加以下内容:

<authentication mode="Forms" >
    <forms cookieless="UseCookies" 
           name="LoginCookieName" 
           loginUrl="~/Default.aspx"/>
</authentication>

该部分指定了身份验证模式为Forms,Cookie的使用方式,Cookie名称,默认登录页面(当未认证或认证失败时会跳转到默认登录页)。

为何要设置Cookie呢?

因为Forms的身份认证是通过Cookie来维持的,且该Cookie是加密过的HttpOnly Cookie(无法在浏览器端更改的Cookie)

二、条件

基础设置

功能很简单,点击按钮,开始听写,在label上显示识别出的内容

@property (nonatomic, strong) AVAudioEngine *audioEngine;                           // 声音处理器
@property (nonatomic, strong) SFSpeechRecognizer *speechRecognizer;                 // 语音识别器
@property (nonatomic, strong) SFSpeechAudioBufferRecognitionRequest *speechRequest; // 语音请求对象
@property (nonatomic, strong) SFSpeechRecognitionTask *currentSpeechTask;           // 当前语音识别进程
@property (nonatomic, weak) IBOutlet UILabel *showLb;       // 用于展现的label
@property (nonatomic, weak) IBOutlet UIButton *startBtn;    // 启动按钮

在viewDidLoad中初始化,并判断用户授权是否通过

// 初始化
self.audioEngine = [AVAudioEngine new];
// 这里需要先设置一个AVAudioEngine和一个语音识别的请求对象SFSpeechAudioBufferRecognitionRequest
self.speechRecognizer = [SFSpeechRecognizer new];
self.startBtn.enabled = NO;

[SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status)
{
    if (status != SFSpeechRecognizerAuthorizationStatusAuthorized)
    {
        // 如果状态不是已授权则return
        return;
    }

    // 初始化语音处理器的输入模式
    [self.audioEngine.inputNode installTapOnBus:0 bufferSize:1024
                                         format:[self.audioEngine.inputNode outputFormatForBus:0]
                                          block:^(AVAudioPCMBuffer * _Nonnull buffer,
                                                  AVAudioTime * _Nonnull when)
    {
        // 为语音识别请求对象添加一个AudioPCMBuffer,来获取声音数据
        [self.speechRequest appendAudioPCMBuffer:buffer];
    }];
    // 语音处理器准备就绪(会为一些audioEngine启动时所必须的资源开辟内存)
    [self.audioEngine prepare];

    self.startBtn.enabled = YES;
}];

注意: 如果你在info.plist文件中设置NSMicrophoneUsageDescription失败,这时如果尝试访问_audioEngine.InputNode会使你的app崩溃,且你无法catch到有用的信息。

授权

授权的问题就是用户与用户组权限的问题,根据当前登录用户及其所属用户组的权限来判断当前用户的请求是否能够访问目标资源。

Forms身份认证的授权也需要在Web.config的<system.web>节点中配置,示例如下:

<authorization>
    <allow users="admin"/>
    <deny users="*"/>
</authorization>

1、认证服务号(因为需要先网页授权识别访问者的身份)

实现功能

自定义验证用户登录

三、说明

点击按钮

- (IBAction)onStartBtnClicked:(id)sender
{
 if (self.currentSpeechTask.state == SFSpeechRecognitionTaskStateRunning)
   {   // 如果当前进程状态是进行中

      [self.startBtn setTitle:@"Start Dictating" forState:UIControlStateNormal];
      // 停止语音识别
      [self stopDictating];
  }
   else
    {   // 进程状态不在进行中
     [self.startBtn setTitle:@"Stop Dictaring" forState:UIControlStateNormal];
     self.showLb.text = @"I'm waiting";
        // 开启语音识别
     [self startDictating];
    }
}

- (void)startDictating
{
   NSError *error;
  // 启动声音处理器
   [self.audioEngine startAndReturnError: &error];
   // 初始化
   self.speechRequest = [SFSpeechAudioBufferRecognitionRequest new];

    // 使用speechRequest请求进行识别
  self.currentSpeechTask =
  [self.speechRecognizer recognitionTaskWithRequest:self.speechRequest
                                    resultHandler:^(SFSpeechRecognitionResult * _Nullable result,
                                                    NSError * _Nullable error)
    {
        // 识别结果,识别后的操作
        if (result == NULL) return;
        self.showLb.text = result.bestTranscription.formattedString;
    }];
}

在这个方法中我们创建了一个新的识别请求和语音进程。当通过识别对象更新数据的时候,则更新label的text,无论听写是否仍然在进行中。
最后 我们只需要实现stopDictating:

- (void)stopDictating
{
    // 停止声音处理器,停止语音识别请求进程
     [self.audioEngine stop];
     [self.speechRequest endAudio];
}

好了,代码很少,很多东西也在注释中写明了,现在已经可以实现听写的功能了。这时如果我们对识别的结果再进行一次判断,根据不同的结果来执行不同的操作,应该会有不错的用户体验吧。

参考:http://gregshackles.com/using-speech-recognition-in-ios-10/?utm_source=tuicool&utm_medium=referral

一、Filter

ASP.NetMVC模式自带的过滤器Filter,是一种声明式编程方式,支持四种过滤器类型,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。

​ 表1

过滤器类型 接口 描述
Authorization IAuthorizationFilter 此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法
Action IActionFilter 用于进入行为之前或之后的处理
Result IResultFilter 用于返回结果的之前或之后的处理
Exception IExceptionFilter 用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

但是默认实现它们的过滤器只有三种,分别是ActionFilter(方法),Authorize(授权),HandleError(错误处理);各种信息如下表所示:

​ 表2

过滤器 类名 实现接口
Authorize AuthorizeAttribute IAuthorizationFilter
HandleError HandleErrorAttribute IExceptionFilter
自定义 ActionFilterAttribute IActionFilter和IResultFilter

ASP.NET默认的身份验证过滤器是[Authorize]对应AuthorizeAttribute类

1、增强判断在授权页面刷新会code报错问题,即使刷新也能重新授权;

二、通过自定义过滤器实现登录验证

表2中只写了实现表1中的接口,实际上ActionFilterAttribute继承了FilterAttribute、IActionFilter和IResultFilter.

具体实现方法

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class AuthenticatedAttribute:FilterAttribute, IActionFilter
{  
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {

    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //此处AuthenticationMoudel类中的UserName属性已在认证模块中定义
        if (string.IsNullOrEmpty(AuthenticationMoudel.UserName))
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}  

最后在需要登录验证的地方打下自定义的Filter的标签[Authenticated]

[Authenticated]
public class HomeController : Controller  
{  
    public ActionResult Index()  
    {  
        ViewBag.Message = "欢迎使用 ASP.NET MVC!";  
        return View();  
    }  
}

2、不需要存数据库对比

三、使用系统的AuthorizeAttribute验证登录

public class AuthenticationAttribute : AuthorizeAttribute
{
  public override void OnAuthorization(AuthorizationContext filterContext)
  {
    //base.OnAuthorization(filterContext);
    //如果控制器没有加AllowAnonymous特性或者Action没有加AllowAnonymous特性才检查
    if (!filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true) && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true))
    {
      //此处写判断是否登录的逻辑代码
      HttpCookie cookie = filterContext.HttpContext.Request.Cookies["Member"];
      if (!(cookie!=null && cookie.Values["name"] == "test" && cookie.Values["pass"] == "123"))       {
        filterContext.Result = new RedirectResult("/Member/Login");
      }
    }
  }
}

若加了Authentication过滤器的控制器中有需要匿名访问的方法,可以在方法前面添加[AllowAnonymous]过滤器

澳门新濠3559,另一种写法是继承FilterAttribute 并实现接口IAuthorizationFilter,方式与系统的AuthorizeAttribute类似

参考文章:1. 细说ASP.NET Forms身份认证

​ 2. ASP.Net MVC Filter验证用户登录

菜鸟一枚,还望大家多多指教

补充:在运行上述代码时,发现配置了Forms认证后登录不成功,匿名用户访问需要认证的页面时不能跳转到登录页面,解决方案如下:
在Web.Config文件的<system.webServer>节添加下面两句

<remove name="FormsAuthentication" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />

刚开始我只有第一句<remove name="FormsAuthentication" />,添加第二句后解决问题。

四、演示

1、未关注访问

澳门新濠3559 2

2、已关注访问

澳门新濠3559 3

 

需要判断关注SDK demo(PHP版)的请联系 851 488 243,备注:微信关注

 

编辑:编程 本文来源:识别用户是否关注公众号,身份认证过程分为两

关键词: