此请求的授权已被拒绝.总是这样
本文关键字:拒绝 请求 授权 | 更新日期: 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的方式引起的。一些背景:
- 我使用自定义AuthenticationHandler(从DelegationHandler继承)
- 在这个处理程序中,我重写了SendAsync方法来做一些自定义的用户验证。
- 如果验证成功,我构造一个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...