此请求的授权已被拒绝.总是这样

本文关键字:拒绝 请求 授权 | 更新日期: 2023-09-27 18:16:27

我已经创建了一个MVC webApi项目,现在我想使用身份验证和授权。我想我已经实现了这种安全性,但由于某种原因,事情变坏了,当我写我的凭据,我试图调用一些webApi方法的消息"授权已被拒绝此请求"显示。

这是我实现的代码。

WebApiConfig:

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Web API routes
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Filters.Add(new AuthorizeAttribute());
    }
路由配置:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Routing", action = "LogIn", id = UrlParameter.Optional }
        );
    }

控制器:

public class RoutingController : Controller
{
    //
    // GET: /Routing/
    public ActionResult Index()
    {
        return View();
    }
    public ActionResult Projects()
    {
        return View();
    }
    public ActionResult Users()
    {
        return View();
    }
    public ActionResult LogIn()
    {
        return View();
    }
    [HttpPost]
    public JsonResult LogInPost(string userName, string password)
    {
        User user = new User();
        RoleByUser rByU = new RoleByUser();
        password = UserController.EncriptPassword(password);
        string url = string.Empty;
        var checkUser = user.Get(userName);
        var userExists = (from userInList in checkUser where userInList.UserName == userName && userInList.Password == password select userInList).FirstOrDefault();
        if(userExists!= null)
        {
            var roles = (from roleByUser in userExists.listOfRole select roleByUser.RoleName.Trim()).ToArray();
            IPrincipal principal = new GenericPrincipal(
            new GenericIdentity(userExists.UserName), roles);
            SetPrincipal(principal);
            url = "Routing/Users";
        }
        return Json(url);
    }
    private void SetPrincipal(IPrincipal principal)
    {
        Thread.CurrentPrincipal = principal;
        if (System.Web.HttpContext.Current != null)
        {
            System.Web.HttpContext.Current.User = principal;
        }
    }
}
HTML:

<link href="~/css/Style.css" rel="stylesheet" type="text/css" />
<div class="container">
    <div class="card card-container">
        <img id="STK" class="profile-img-card" src="Images/Softtek.png" />
        <p id="profile-name" class="profile-name-card"></p>
        <form class="form-signin">
            <span id="reauth-email" class="reauth-email"></span>
            <input type="text" id="txtUserName" class="form-control" placeholder="Email address" required autofocus />
            <input type="password" id="txtPassword" class="form-control" placeholder="Password" required />
            <div id="remember" class="checkbox">
                <label>
                    <input type="checkbox" value="remember-me" /> Remember me
                </label>
            </div>
            @*<button id="btnLogIn" class="btn btn-lg btn-primary btn-block btn-signin"  >Sing In</button>*@
        </form><!-- /form -->
        <button id="btnLogIn" class="btn btn-lg btn-primary">Sing In</button>
        <a href="#" class="forgot-password">
            Forgot the password?
        </a>
    </div><!-- /card-container -->
</div><!-- /container -->

JS:

美元(文档)。Ready (function () {$ (' # btnLogIn ') .click(登录);});

function logIn() {
    $.ajax({
        type: "POST",
        url: "http://localhost:21294/Routing/LogInPost",
        dataType: "json",
        data: { userName: $('#txtUserName').val(), password: $('#txtPassword').val() },
        success: function (data) {
            if(data!= "" && data!= undefined && data!= null)
                window.location.href = data;
        },
        error: function (err, e, error) {
            toastr.error('Error')
        }
    });

此请求的授权已被拒绝.总是这样

您应该将[AllowAnonymous]属性添加到控制器的LogInPost

当你将AuthorizeAttribute添加到你的过滤器时,它会导致你的控制器默认认为他们需要对所有操作进行授权,包括用于登录的操作。

你在做Windows身份验证吗?你得到"拒绝访问"错误吗?

有时IISEXpress和IIS做了一些技巧,为了克服这个问题,我把网站托管在本地IIS (inetmgr)中,启用身份验证(windows如果适用),现在运行它。

注:并不是所有的机器都默认安装了IIS服务器,所以如果inetmgr不起作用,那么你必须从控制面板-> Windows功能->选择IIS和asp.net的所有功能来安装它

很抱歉这么晚才回复-我发现你的问题是因为,从iis托管的web api切换到自托管的web api,我刚刚开始遇到同样的问题。

在我的例子中,问题是由我初始化Thread.CurrentPrincipal的方式引起的。一些背景:

  1. 我使用自定义AuthenticationHandler(从DelegationHandler继承)
  2. 在这个处理程序中,我重写了SendAsync方法来做一些自定义的用户验证。
  3. 如果验证成功,我构造一个claimprincipal类的实例来包含一些关于当前用户的声明。

之前,我将这个claimprincipal实例分配给Thread。在将消息传递给管道中剩余的消息处理程序之前。然而,对我来说,解决方案是在HttpRequestContext实例上使用Principal成员,该实例属于传递给SendAsync的HttpRequestMessage实例。因此(在f#中),

override this.SendAsync(request : HttpRequestMessage, cancellationToken : CancellationToken) =
  // Do some user validation here first
  // .. then setup the claims (method details omitted) 
  let principal = BuildClaimsPrincipal
  // Assign to Principal on HttpRequestContext
  let requestContext = request.GetRequestContext
  requestContext.Principal <- principal
  // Rest of method omitted...