[英]Authorization has been denied for this request. Always
我已經創建了一個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:
$(document).ready(function(){$('#btnLogIn')。click(logIn);});
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]
屬性添加到Controller的LogInPost
將AuthorizeAttribute
添加到過濾器時,會導致控制器假定所有操作(包括用於登錄的操作)默認需要授權。
你在做Windows身份驗證嗎? 你收到“拒絕訪問”錯誤?
有時IISEXpress和IIS做了一些技巧並且克服了我在本地iis(inetmgr)中托管該站點的情況,啟用身份驗證(如果適用,則啟用Windows)並立即運行它。
PS並非所有機器都默認安裝了IIS服務器,因此如果inetmgr不起作用,則必須從控制面板 - > Windows功能 - >選擇IIS和ASP .NET的所有功能
希望這會有所幫助。
很抱歉這么晚的回復 - 我找到了你的問題,因為,從IIS托管的網絡API切換到自托管的網絡API,我剛開始遇到同樣的問題。
在我的情況下,問題是由我如何初始化Thread.CurrentPrincipal引起的。 一些背景:
以前,我將此ClaimsPrincipal實例分配給Thread.CurrentPrincipal,然后將消息傳遞給管道中的其余消息處理程序。 但是,我的解決方案是在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...
希望這能夠以某種方式幫助你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.