ASP.NET MVC5 自定义身份验证

Posted

技术标签:

【中文标题】ASP.NET MVC5 自定义身份验证【英文标题】:ASP.NET MVC5 custom authentication 【发布时间】:2019-10-15 04:18:22 【问题描述】:

我正在为我的 ASP.NET 应用程序编写自定义身份验证逻辑。我需要通过我们的另一个 API 对我们的用户进行身份验证。我需要将用户登录名和密码发送到外部 API,如果用户存在,服务将向我发送 true 否则 false。

这是我的 Logincontroller actionresult 代码,最终应该将经过身份验证的用户重定向到 uploadFileController 操作:

[HttpPost]
public ActionResult AccountLogin(AuthenticationViewModel authModel)

    //exists in database
    bool isExistUser = _service.isUserExist(authModel.UserName);

    if (!isExistUser)
    
        TempData["UserIsNotExist"] = "User does not exist.";
        return RedirectToAction("AccountLogin");
    

    ServiceExternalApi.srvEmployeeSoapClient client = new ServiceExternalApi.srvEmployeeSoapClient();

    bool isUserExistInHrm = hrmclient.f_EmployeeCheckLogin(authModel.UserName, authModel.Password);

    if (!isUserExistInHrm)
    
        TempData["UserisNotExistInInExternalApi"] = "Wrong credentials.";
        return RedirectToAction("AccountLogin");
    

    return RedirectToAction("GetAlreadyScannedFileList","UploadFile");

如果我将授权属性添加到“UploadFile”控制器,则此代码根本不起作用。任何建议表示赞赏。

换句话说,我如何在这个逻辑中使用 [Authorize] 属性?如果外部服务向我发送 true 我希望获得授权,如果 false 未经授权。

【问题讨论】:

Authorize 会一直检查 Authorization 是否存在。 BTW 服务检查后需要执行什么类型的操作,检查结束后是否需要进行任何基于角色的授权? 不,不需要角色。 我能以某种方式覆盖 Authorize 属性以满足我的需要吗? 我只想让它以这种方式工作,如果外部服务发送给我的话,那么我希望看到该用户被授权。假的情况下对应未授权。 现在发生了什么?它在调试器没有进入“UploadFile”的意义上不起作用? 【参考方案1】:

您需要在客户端机器上设置身份验证cookie,以便在成功登录后允许后续请求。

public class CustomeAuthorizeAttribute : AuthorizeAttribute


     public override void OnAuthorization(AuthorizationContextfilterContext)          
    
         if (!isUserExistInHrm)
        
            TempData["UserisNotExistInInExternalApi"] = "Wrong credentials.";
            return RedirectToAction("AccountLogin");
        
        else
        
            FormsAuthentication.SetAuthCookie(authModel.UserName, false);
        
    

配置表单身份验证

将应用程序配置为使用表单身份验证。这可以在 web.config 文件中完成。

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

现在在您的uploadFileController 上添加[CustomeAuthorize] 属性

[CustomeAuthorize]
public class uploadFileController  : Controller



【讨论】:

该逻辑应该写在 [Authorize] 属性中,换句话说,我应该扩展 Authorize 类还是不扩展? 我还有一个问题。如果我们将属性放在控制器类的头部,您认为最佳解决方案是什么?我有很多行动结果,每次我都必须调用外部api?如果我将属性赋予特定的动作结果,会不会效率更高?

以上是关于ASP.NET MVC5 自定义身份验证的主要内容,如果未能解决你的问题,请参考以下文章

将 ASP.NET MVC5 身份验证添加到现有项目

ASP.Net MVC 5 身份验证与另一个 MVC 5 身份网站

我们可以在不使用 ASP.Net Identity 的情况下使用 MVC 5 提供的 cookie 身份验证吗?

ASP.NET MVC5 OWIN Facebook 身份验证突然不起作用

如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证

ASP.NET Core 身份中的角色声明与自定义身份验证中的角色权限相比